SqlCommandBuilder не назначает ConnectionString - PullRequest
1 голос
/ 20 декабря 2010

Я использую 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 Ответ

5 голосов
/ 21 декабря 2010

К тому времени, когда вызывается ваш второй фрагмент кода, SqlConnection, созданный вами в первом, был удален в соответствии с оператором using.Вот почему это не инициализировано.Вам придется либо не удалять это соединение, либо создать другое соединение для вашего второго фрагмента кода.

Например, например:

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
...