在传递带有已修改行的DataRow集合时,Update需要有效的UpdateCommand。可以做些什么?

时间:2014-10-23 11:19:59

标签: vb.net

Dim conn As OleDbConnection

Dim com As OleDbCommand

conn = New 

OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source= D:\Mohamed Ayman\Donic.mdb")

com = New OleDbCommand("Update SET [Firstname] =@fn , [Surname] =@sn  ,  [Gender] =@g  , [PhoneNumber] =@p1  , [PhoneNumber2] =@p2  , [PhoneNumber3] =@p3  , [Country] =@co  , [City] =@ci  , [Club] =@cl  , [Notes] =@n  , [Email] =@e  , [CurrentDate] =@cd  , [Date] =@d where [Firstname] =@store  And [SurName] =@store1 And [PhoneNumber] =@store2  And  [Club] =@store3 ", conn)


conn.Open()
com.Parameters.AddWithValue("@store", tsearch.Text)
com.Parameters.AddWithValue("@store1", ComboBox.Text)
com.Parameters.AddWithValue("@store2", ComboBox3.Text)
com.Parameters.AddWithValue("@store3", ComboBox2.Text)
com.Parameters.AddWithValue("@fn", txt.Text)
com.Parameters.AddWithValue("@sn", txt1.Text)
If m.Checked = True Then
    com.Parameters.AddWithValue("@g", "Male")
End If
If f.Checked = True Then
    com.Parameters.AddWithValue("@g", "Female")
End If
com.Parameters.AddWithValue("@p1", p1.Text)
If p2.Enabled = True Then
    com.Parameters.AddWithValue("@p2", p2.Text)
End If
If p3.Enabled = True Then
    com.Parameters.AddWithValue("@p3", p3.Text)
End If

com.Parameters.AddWithValue("@co", co.Text)
If ci.Enabled = True Then
    com.Parameters.AddWithValue("@ci", ci.Text)
End If
com.Parameters.AddWithValue("@cl", cl.Text)
If Not n.Text = "" Then
    com.Parameters.AddWithValue("@n", n.Text)
End If
If Not eee.Text = "" Then
    com.Parameters.AddWithValue("@e", eee.Text)
End If
com.Parameters.AddWithValue("@cd", Date.Today)
com.Parameters.AddWithValue("@d", start)

com.ExecuteNonQuery()
MsgBox("Record Updated")
conn.Close()

我做了你的建议,我得到一个新的错误,一个奇怪的错误// ExecuteNonQuery需要一个开放的可用连接。连接的当前状态已关闭// 怎么这是明显的conn.open然后关闭!!

1 个答案:

答案 0 :(得分:1)

你不需要OleDbDataAdapter。这不是OleDbDataAdapter的预期目的。您应该只使用OleDbCommand。

以下示例不完整,我不确切知道您的字段名称,但实际上,您应该准备一个UPDATE sql text,您可以在其中设置应更新的字段的值,放置占位符(?)而不是实际值。然后构建一个新的OleDbCommand,设置其连接及其命令文本,并使用参数的名称和值填充Parameters集合。

作为OleDb的情况,参数的名称并不重要,但是将它们添加到集合中的顺序是必不可少的。
您应该尊重占位符在命令文本中出现的确切顺序(因此ClientsID的值应该是最后一个)

Using conn = new OleDbConnection("PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source= D:\Mohamed Ayman\Donic.mdb"
Using cmd = new OleDbCommand()
     conn.Open()
     Dim clientID = Convert.ToInt32(dsnew.Tables("Clients").Rows(0)("ClientsID"))
     sqlnew = "UPDATE Clients SET [FirstName] = ?, [SurName] = ?, " & 
              "Gender = ?, Phone = ? ........ WHERE ClientsID = ?"
     cmd.Connection = con
     cmd.CommandText = sqlNew
     cmd.Parameters.AddWithValue("@fname", txt.Text)
     cmd.Parameters.AddWithValue("@sname", txt1.Text)
     cmd.Parameters.AddWithValue("@gend", If m.Checked, "Male", If f.Checked, "Female", "");
     cmd.Parameters.AddWithValue("@phone", p1.Text);
     .....
     cmd.Parameters.AddWithValue("@id", clientID);
     cmd.ExecuteNonQuery()
End Using
End Using

请注意,我还更改了打开和关闭连接的方式。最佳做法是使用USING STATEMENT。当您退出using块时,这将自动关闭并处理连接和命令。在异常的情况下也是如此

作为旁注。当您需要进行此类验证时,最好将所有这些测试隔离在一个返回true或false的单独函数中。如果函数返回true,则继续执行更新

 Public Function IsDataValid() As Boolean
    If txt.Text = "" Then
        MsgBox("Please Enter First Name")
        txt.Focus()
        return False
    Else if txt1.Text = "" Then
        MsgBox("Please Enter Second Name ")
        txt1.Focus()
        return False
    Else If m.Checked = False And f.Checked = False Then
        ....
    Else 
        return true
    End If

因此您的代码可以简化为

If IsDataValid() Then
    .... execute the update
End if