我有带未绑定数据的DataGridView,当我运行下面的代码时,除了已存在的列之外,它还会创建新的列。我该怎么做才能防止这种情况发生?
Dim connection2 As SqlConnection
connection2 = New SqlConnection(clVariables.dbTestConnectionString)
Dim CMD As New SqlCommand("DoGetSomething")
Dim adapter As New SqlDataAdapter(CMD)
CMD.Connection = connection2
CMD.CommandType = CommandType.StoredProcedure
CMD.Parameters.AddWithValue("@ID", SqlDbType.VarChar).Value = 1
Dim ds As Data.DataSet = New Data.DataSet
adapter.Fill(ds)
dbtTableTmp.DataSource = ds.Tables(0)
dbtTableTmp.ReadOnly = True
dbtTableTmp.Refresh()
答案 0 :(得分:0)
使用...结束使用块可以确保即使发生错误也可以关闭和处置数据库对象。
您可以将连接以及存储过程的名称直接传递给命令的构造函数。
由于您将网格标记为只读,因此不需要数据适配器,并且由于我们仅处理一个表,因此不需要数据集。
.AddWithValue
的第二个参数是要添加到数据库的值。您正在将.Add
与.AddWithValue
混合在一起。出于多种原因,首选.Add
方法。这里还有另一个问题。数据类型不能是VarChar,值不能为1。1是Integer,而VarChar是字符串。我猜到了.Int,但是检查数据库以查看正确的内容。
遵循@Jimi在评论中提供的指示。
Private Sub FillGrid()
Dim dt As New DataTable
Using connection2 As New SqlConnection(clVariables.dbTestConnectionString)
Using CMD As New SqlCommand("DoGetSomething", connection2)
CMD.CommandType = CommandType.StoredProcedure
CMD.Parameters.Add("@ID", SqlDbType.Int).Value = 1
connection2.Open()
dt.Load(CMD.ExecuteReader)
End Using
End Using
dbtTableTmp.DataSource = dt
dbtTableTmp.ReadOnly = True
dbtTableTmp.Refresh()
End Sub