我在布局视图中使用devexpress XtraGrid来编辑最近创建的数据库行。 这是我用来加载数据的代码:
Public Function SetData(ByVal connString As String, ByVal tabla As String) As Boolean
Dim d As New DataTable
Dim cmd As New SqlCommand
Try
Using conn As New SqlConnection(connString)
conn.Open()
cmd.Connection = conn
m_Tabla = tabla
If (m_Id = "") Then
cmd.CommandText = "SELECT * FROM " & m_Tabla
Else
cmd.CommandText = "SELECT * FROM " & m_Tabla & " WHERE IdCaptura = '" & m_Id & "'"
End If
m_Adapter = New SqlDataAdapter(cmd)
m_DataSet = New DataSet()
m_Adapter.Fill(m_DataSet, m_Tabla)
grdMetadata.DataSource = m_DataSet.Tables(m_Tabla)
Return True
End Using
Catch ex As Exception
Return False
End Try
End Function
数据库可能因客户端而异,因此AFAIK我无法编写更新命令;我一直在调查这个问题,我的结论是我需要使用SqlCommandBuilder来自动生成它。
当用户结束编辑数据时,我使用以下代码段来更新数据库:
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceptar.Click
Try
Dim builder As New SqlCommandBuilder(m_Adapter)
grdLayoutView.CloseEditor()
grdLayoutView.UpdateCurrentRow()
m_Adapter.Update(m_DataSet, m_Tabla) *
Catch ex As Exception
lblEstado.Text = ex.Message
End Try
End Sub
在标有*的行中,我得到一个“ConnectionString属性尚未初始化”的异常。该表有一个主键列(IdCaptura),如果我在所述行中放置一个断点,我可以看到DataAdapter.UpdateCommand设置为空。
对这里的错误有什么看法?
答案 0 :(得分:5)
当您调用第二个代码段时,根据using
语句,您在第一个代码段中处理的SqlConnection已被处理掉。这就是为什么它没有初始化。您将不得不在那里处理连接,或为您的第二个代码段创建另一个连接。
像这样,例如:
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceptar.Click
Try
Using conn As New SqlConnection(connString) ' <--- need to get the connection string from somewhere here '
conn.Open()
m_Adapter.UpdateCommand.Connection = conn
Dim builder As New SqlCommandBuilder(m_Adapter)
grdLayoutView.CloseEditor()
grdLayoutView.UpdateCurrentRow()
m_Adapter.Update(m_DataSet, m_Tabla) *
End Using
Catch ex As Exception
lblEstado.Text = ex.Message
End Try
End Sub