Private Sub ButtonSubmitID_Click(sender As Object, e As EventArgs) Handles ButtonSubmitID.Click
Dim comm As New SqlCommand
Dim conn As New SqlConnection
conn.ConnectionString = "Data Source = localhost\SQLEXPRESS; Initial Catalog = test2Forms; Integrated Security = SSPI;"
comm.Connection = conn
Dim ID = TextBoxID.Text
comm.Parameters.AddWithValue("@ID", ID)
Dim adapter As SqlDataAdapter = New SqlDataAdapter(comm.CommandText, comm.Connection)
comm.CommandText = "SELECT * FROM withActivityLog3 WHERE ID = @ID"
Dim records As DataSet = New DataSet
adapter.Fill(records)
DataGridView2.DataSource = records
End Sub
CommandText属性尚未初始化是我收到的错误。我能够将数据库中的所有数据拉到Form Load上的GridView中,但是当我尝试使用按钮触发器上的WHERE子句将其缩小到一个ID时,它会出现上述错误。我使用调试器一次跟踪一个步骤,命令和连接字符串看起来正确。我还使用SQL Server命令行在我的数据库上成功复制了查询。我正在搜索主键(ID),因此预期结果将是数据库中唯一标识的行。
答案 0 :(得分:1)
至于你知道的问题:
' initialize DataAdapter with (EMPTY) commandtext
Dim adapter As SqlDataAdapter = New SqlDataAdapter(comm.CommandText, comm.Connection)
' initialize Command Text
comm.CommandText = "SELECT * FROM withActivityLog3 WHERE ID = @ID"
当您将CommandText
传递给DataAdapter时,它是空的,因为您尚未设置它,这会导致错误。
但是你的代码中存在相当多的低效率。改写为:
' form level conn string
Private TheConnString As String = "Data Source = localhost\..."
Private Sub ButtonSubmitID_Click(sender ...
Dim dt As New DataTable
Using dbcon As New MySqlConnection(TheConnString)
Using cmd As New MySqlCommand("select * from Sample where Id = @id", dbcon)
cmd.Parameters.Add("@id", MySqlDbType.Int32).Value = Convert.ToInt32(TextBox2.Text)
dbcon.Open()
dt.Load(cmd.ExecuteReader)
dgvA.DataSource = dt
End Using
End Using
End Sub
注意:这使用MySQL,但Sqlite,Access,SQL Server等的概念是相同的
Dispose()
方法的内容。这包括几乎所有的DB Provider对象。 Using
语句允许您声明和初始化一个对象,并在End Using
处理它。未能Dispose
的事情可能导致泄漏,甚至用尽连接或资源来创建DB Command对象之类的东西。DbDataAdapter
。这些非常强大且有用的小动物不仅仅需要填充DataTable
。如果您只是这样做,则可以在ExecuteReader
对象上使用DbCommand
方法。DataSet
。与名称相反,这些不包含数据,而是DataTables
。因为只有一个并且它是本地的(当方法结束时超出范围),你不需要DataSet
来存储它。Add
方法而不是AddWithValue
。上面的代码指定了参数的数据类型,因此编译器不需要猜测。当然,需要将文本转换为数字...... Integer.Tryparse
更合适:I like pie
不会转换为整数。在开始DB操作之前,您应该进行数据验证。Dim ID = TextBoxID.Text
使用的是无意义的代码。您无需将文本框文本移动到新变量中即可使用它。但是,ID
可能用于存储整数值