Home All Groups Group Topic Archive Search About

Updating access database

Author
24 Mar 2006 7:00 PM
glenn
Thanks in advance for any help.

I am using code that is directly from David Sceppa's book from MS Press
titled "ADO.NET".

I have walked completely though the code and I find values are what they
should be until I reach the following subroutine.

     Private Sub SubmitChangesByHand()
        Dim cmdUpdate As System.Data.OleDb.OleDbCommand =
CreateUpdateCommand()

        Dim row As System.Data.DataRow
        Dim intRowsAffected As Integer
        Dim dvrs As System.Data.DataViewRowState
        dvrs = System.Data.DataViewRowState.ModifiedCurrent Or
System.Data.DataViewRowState.Deleted Or System.Data.DataViewRowState.Added
        For Each row In tbl.Select ("", "", dvrs)
        msgbox("in the for loop")
          intRowsAffected = SubmitUpdate(row, cmdUpdate)
          msgbox(intRowsAffected)
          if intRowsAffected = 1 then
            row.AcceptChanges()
          else
            row.RowError = "Update attempt failed"
          End If
        Next row
     End Sub

For some reason I am not getting inside the For loop.  Only thing I can see
is that the DataViewRowState is returning a value of 28 which should be 16
(for updating a database).  I invoke the function by a button click event
elsewhere in the code.

Other than that, the table has records in it which is declared elsewhere as:
Dim tbl As New System.Data.DataTable("categories")

I am using the Northwind database in my trial efforts.

Author
24 Mar 2006 7:26 PM
Norman Yuan
Since your MsgBox inside the For loop did not get shown, it is obvious that
tblSelect() does not return any changed DataRow, so, there is no change in
the table to be updated to database.

You can re-write it to make it clearer:

dvrs = System.Data.DataViewRowState.ModifiedCurrent Or
System.Data.DataViewRowState.Deleted Or System.Data.DataViewRowState.Added
Dim drs as DataRow()=tbl.Select("","",dvrs)
If drs.Length=0 Then
    MsgBox("There is no change in DataTable. No update is needed!")
Else
    For Each row in drs
        ''''do update here
    Next row
End If

You can also use DataTable.GetChange() to make sure there is change before
updating data to database.

Show quote
"glenn" <gl***@discussions.microsoft.com> wrote in message
news:9FC560EE-7603-4634-85C1-12834929E2E9@microsoft.com...
> Thanks in advance for any help.
>
> I am using code that is directly from David Sceppa's book from MS Press
> titled "ADO.NET".
>
> I have walked completely though the code and I find values are what they
> should be until I reach the following subroutine.
>
>     Private Sub SubmitChangesByHand()
>        Dim cmdUpdate As System.Data.OleDb.OleDbCommand =
> CreateUpdateCommand()
>
>        Dim row As System.Data.DataRow
>        Dim intRowsAffected As Integer
>        Dim dvrs As System.Data.DataViewRowState
>        dvrs = System.Data.DataViewRowState.ModifiedCurrent Or
> System.Data.DataViewRowState.Deleted Or System.Data.DataViewRowState.Added
>        For Each row In tbl.Select ("", "", dvrs)
>        msgbox("in the for loop")
>          intRowsAffected = SubmitUpdate(row, cmdUpdate)
>          msgbox(intRowsAffected)
>          if intRowsAffected = 1 then
>            row.AcceptChanges()
>          else
>            row.RowError = "Update attempt failed"
>          End If
>        Next row
>     End Sub
>
> For some reason I am not getting inside the For loop.  Only thing I can
> see
> is that the DataViewRowState is returning a value of 28 which should be 16
> (for updating a database).  I invoke the function by a button click event
> elsewhere in the code.
>
> Other than that, the table has records in it which is declared elsewhere
> as:
> Dim tbl As New System.Data.DataTable("categories")
>
> I am using the Northwind database in my trial efforts.
Author
26 Mar 2006 10:44 PM
glenn
Thanks for your reply.

I am now successfully getting into the For loop.

When I hit the SubmitUpdate function, I get a compiler error with an
Identifier expected for a line of code in the SubmitUpdate function as
follows:

pc.("CategoryID_Orig").Value = row("CategoryID", DataRowVersion.Original)

The following code snippets contain three functions or subroutines for your
insight.

           Function CreateUpdateCommand() As OleDbCommand
            Dim StrSQL As String
            Dim connectionString As String = "Provider=Microsoft.Jet.4.0;
Ole DB Services=-4; Data Source=C:\Program File"& _

"s\Microsoft.NET\SDK\v2.0\QuickStart\aspnet\samples\data\App_Data\Northwind.mdb"
            Dim dbConnection As IDbConnection = New
OleDbConnection(connectionString)


            strSQL = "UPDATE [Categories] SET CategoryName=?, Description=?
WHERE CategoryID=?"

            Dim cmd As New OleDbCommand (strSQL, dbConnection)
            Dim pc As OleDbParameterCollection = cmd.Parameters

            pc.Add("CategoryID_New", OleDbType.Integer)
            pc.Add("CategoryName_New", OleDbType.BSTR)
            pc.Add("Description_New", OleDbType.BSTR)

            pc.Add("CategoryID_Orig", OleDbType.Integer)
            pc.Add("CategoryName_Orig", OleDbType.BSTR)
            pc.Add("Description_Orig", OleDbType.BSTR)

            Return cmd
         End Function


          Sub SubmitChangesByHand()
            Dim cmdUpdate As OleDbCommand = CreateUpdateCommand()

            Dim row As DataRow
            Dim intRowsAffected As Integer
            Dim dvrs As DataViewRowState
            dvrs = DataViewRowState.ModifiedCurrent Or
DataViewRowState.Deleted _
        Or DataViewRowState.Added Or DataViewRowState.ModifiedOriginal _
        Or DataViewRowState.CurrentRows Or DataViewRowState.None _
        Or DataViewRowState.OriginalRows Or DataViewRowState.Unchanged

            For Each row In tbl.Select ("", "", dvrs)
            msgbox("in the for loop")
              intRowsAffected = SubmitUpdate(row, cmdUpdate)
              msgbox(intRowsAffected)
              if intRowsAffected = 1 then
                row.AcceptChanges()
              else
                row.RowError = "Update attempt failed"
              End If
            Next row
         End Sub

          Function SubmitUpdate(ByVal row As DataRow, ByVal cmd As
OleDbCommand) As Integer

            Dim pc As OleDbParameterCollection = cmd.Parameters

            pc("CateroryID_New").Value = row("CategoryID")
            pc("CateroryName_New").Value = row("CategoryName")
            pc("Description_New").Value = row("Description")


            pc.("CategoryID_Orig").Value = row("CategoryID",
DataRowVersion.Proposed)
            pc.("CategoryName_Orig").Value = row("CategoryName",
DataRowVersion.Original)
            pc.("Description_Orig").Value = row("Description",
DataRowVersion.Original)


            Return cmd.ExecuteNonQuery
         End Function



Show quote
"Norman Yuan" wrote:

> Since your MsgBox inside the For loop did not get shown, it is obvious that
> tblSelect() does not return any changed DataRow, so, there is no change in
> the table to be updated to database.
>
> You can re-write it to make it clearer:
>
> dvrs = System.Data.DataViewRowState.ModifiedCurrent Or
> System.Data.DataViewRowState.Deleted Or System.Data.DataViewRowState.Added
> Dim drs as DataRow()=tbl.Select("","",dvrs)
> If drs.Length=0 Then
>     MsgBox("There is no change in DataTable. No update is needed!")
> Else
>     For Each row in drs
>         ''''do update here
>     Next row
> End If
>
> You can also use DataTable.GetChange() to make sure there is change before
> updating data to database.
>
> "glenn" <gl***@discussions.microsoft.com> wrote in message
> news:9FC560EE-7603-4634-85C1-12834929E2E9@microsoft.com...
> > Thanks in advance for any help.
> >
> > I am using code that is directly from David Sceppa's book from MS Press
> > titled "ADO.NET".
> >
> > I have walked completely though the code and I find values are what they
> > should be until I reach the following subroutine.
> >
> >     Private Sub SubmitChangesByHand()
> >        Dim cmdUpdate As System.Data.OleDb.OleDbCommand =
> > CreateUpdateCommand()
> >
> >        Dim row As System.Data.DataRow
> >        Dim intRowsAffected As Integer
> >        Dim dvrs As System.Data.DataViewRowState
> >        dvrs = System.Data.DataViewRowState.ModifiedCurrent Or
> > System.Data.DataViewRowState.Deleted Or System.Data.DataViewRowState.Added
> >        For Each row In tbl.Select ("", "", dvrs)
> >        msgbox("in the for loop")
> >          intRowsAffected = SubmitUpdate(row, cmdUpdate)
> >          msgbox(intRowsAffected)
> >          if intRowsAffected = 1 then
> >            row.AcceptChanges()
> >          else
> >            row.RowError = "Update attempt failed"
> >          End If
> >        Next row
> >     End Sub
> >
> > For some reason I am not getting inside the For loop.  Only thing I can
> > see
> > is that the DataViewRowState is returning a value of 28 which should be 16
> > (for updating a database).  I invoke the function by a button click event
> > elsewhere in the code.
> >
> > Other than that, the table has records in it which is declared elsewhere
> > as:
> > Dim tbl As New System.Data.DataTable("categories")
> >
> > I am using the Northwind database in my trial efforts.
>
>
>

AddThis Social Bookmark Button