CommandText属性尚未初始化,检索数据

时间:2017-07-24 21:51:16

标签: vb.net datagridview

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),因此预期结果将是数据库中唯一标识的行。

1 个答案:

答案 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等的概念是相同的

  • 无需键入或粘贴连接字符串,也无需在任何地方使用它。一个表单级变量将允许DRY (Dont Repeat Yourself)代码。
  • 应该处理任何实现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可能用于存储整数值