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然后关闭!!
答案 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