SqlCommandBuilder没有分配ConnectionString

时间:2010-12-20 16:43:59

标签: .net sql-server gridview devexpress datasource

我在布局视图中使用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设置为空。

对这里的错误有什么看法?

1 个答案:

答案 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