2

我是 vb.net 的新手。请多多包涵。我想学习如何在Datagridview. 到目前为止,我了解到最好的方法是将 ? 绑定DatagridViewDataTable? 要求是使用存储过程。我不允许直接访问数据库表。

我的公共变量:

Public intDisbursementID As Long
Dim CS As String = ConfigurationManager.ConnectionStrings("SimpleAccounting.My.MySettings.SimpleAcctgConnectionString").ConnectionString
Dim cb As SqlCommandBuilder = Nothing
Dim da As SqlDataAdapter = Nothing
Dim ds As DataSet = Nothing
Dim dv As DataView
Dim dt As DataTable
Dim bs As BindingSource
Dim isDataLoaded As Boolean

我的以下代码来自加载:

Private Sub LoadDetailsData(ByVal mDisbursementID As Long)

    Using con As SqlConnection = New SqlConnection(CS)
        Try
            da = New SqlDataAdapter("sp_NET_tblDisbursementDetails_CompanyID_DisbursementID", CS)
            da.SelectCommand.CommandType = CommandType.StoredProcedure
            da.SelectCommand.Parameters.AddWithValue("@CompanyID", CInt(ConfigurationManager.AppSettings("CompanyID")))
            da.SelectCommand.Parameters.AddWithValue("@DisbursementID", CLng(mDisbursementID))

            cb = New SqlCommandBuilder(da)
            ''======== I have no idea how to make this work ===============
            'da.InsertCommand = SqlCommand.GetInsertCommand()
            'da.UpdateCommand = SqlCommand.GetUpdateCommand()
            'da.DeleteCommand = SqlCommand.GetDeleteCommand()
            '==============================================================

            dt = New DataTable
            bs = New BindingSource
            da.Fill(dt)
            bs.DataSource = dt
            dgvDisbursementDetails.DataSource = bs
            'dgvDisbursementDetails.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Using

End Sub

我的按钮保存代码:

da.Update(dt)

问题:我不知道如何使SqlCommandBuilderto 工作。有没有办法让我覆盖SqlCommandBuilder并使用我现有的插入、更新、删除存储过程?

我想我找到了一个解决方案:(但我真的不明白数据库方面的副作用。)由于 SQLCommandBuilder 为我制作了插入、更新、删除命令,这是否意味着我不再需要我现有的插入、更新、删除存储过程?我工作的公司不允许直接访问表。

在我更新的代码下方:

Private Sub LoadDetailsData(ByVal mDisbursementID As Long)


    Using con As SqlConnection = New SqlConnection(CS)
        Try
            'con.Open()
            da = New SqlDataAdapter("sp_NET_tblDisbursementDetails_CompanyID_DisbursementID", CS)
            da.SelectCommand.CommandType = CommandType.StoredProcedure
            da.SelectCommand.Parameters.AddWithValue("@CompanyID", CInt(ConfigurationManager.AppSettings("CompanyID")))
            da.SelectCommand.Parameters.AddWithValue("@DisbursementID", CLng(mDisbursementID))

            ds = New DataSet
            da.Fill(ds)
            ds.Tables(0).TableName = "Disbursements"

            dgvDisbursementDetails.DataSource = ds.Tables("Disbursements")

        Catch ex As Exception
            Throw ex
            'MessageBox.Show(ex.Message)
        End Try
    End Using

End Sub

cmdSaveDetails_点击代码:

    cb = New SqlCommandBuilder(da)
    da.Update(ds, "Disbursements")

我试图通过使用存储过程创建我自己的插入、更新、删除命令来复制 SQLCOMMANDBUILDER。我在 buttonSave_Click 上遇到此错误:sqladapter.Update(dtable) 错误:“并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条”

在我更新的代码下方:

全局变量:

Public intDisbursementID as  Long
Dim CS As String = ConfigurationManager.ConnectionStrings("SimpleAccounting.My.MySettings.SimpleAcctgConnectionString").ConnectionString
Dim sqladapter As SqlDataAdapter
Dim dset As DataSet
Dim dtable As DataTable

表单加载代码:

LoadDisbursementDetails(intDisbursementID)
myownSqlCommandBuilder(intDisbursementID)

LoadDisbursementDetails 子代码:

Private Sub LoadDisbursementDetails(ByVal mDisbursementID As Long)

    Using con As SqlConnection = New SqlConnection(CS)

        Try
            sqladapter = New SqlDataAdapter("sproc_DisbursementDetailsSelectByDisbursementID", con)

                sqladapter.SelectCommand.CommandType = CommandType.StoredProcedure
                sqladapter.SelectCommand.Parameters.AddWithValue("@DisbursementID", CLng(mDisbursementID))

                dset = New DataSet
                dtable = New DataTable

                sqladapter.Fill(dset)
                sqladapter.Fill(dtable)

                dgvDisbursementDetails.DataSource = dtable


        Catch ex As Exception
            Throw ex
        End Try

    End Using

End Sub

myownSqlCommandBuilder 子代码:

Private Sub myownSqlCommandBuilderCode(ByVal mDisbursementID As Long)

    Using con As SqlConnection = New SqlConnection(CS)

        Dim delete As New SqlCommand("sproc_DisbursementDetailsDelete", con)
        delete.CommandType = CommandType.StoredProcedure
        delete.Parameters.Add("@DisbursementDetailsID", SqlDbType.BigInt, 8, "DisbursementDetailsID")

        Dim insert As New SqlCommand("sproc_DisbursementDetailsInsert", con)
        insert.CommandType = CommandType.StoredProcedure
        insert.Parameters.Add("@DisbursementID", SqlDbType.BigInt, 8, "DisbursementID")
        insert.Parameters.Add("@CompanyID", SqlDbType.BigInt, 8, "CompanyID")
        insert.Parameters.Add("@DatePosted", SqlDbType.DateTime, 8, "DatePostedID")
        insert.Parameters.Add("@SLID", SqlDbType.BigInt, 8, "SLID")
        insert.Parameters.Add("@Amount", SqlDbType.BigInt, 8, "Amount")
        insert.Parameters.Add("@UserID", SqlDbType.BigInt, 8, "UserID")

        Dim update As New SqlCommand("sproc_DisbursementDetailsUpdate", con)
        update.CommandType = CommandType.StoredProcedure
        update.Parameters.Add("@DisbursementID", SqlDbType.BigInt, 8, "DisbursementID")
        update.Parameters.Add("@CompanyID", SqlDbType.BigInt, 8, "CompanyID")
        update.Parameters.Add("@DatePosted", SqlDbType.DateTime, 8, "DatePostedID")
        update.Parameters.Add("@SLID", SqlDbType.BigInt, 8, "SLID")
        update.Parameters.Add("@Amount", SqlDbType.BigInt, 8, "Amount")
        update.Parameters.Add("@UserID", SqlDbType.BigInt, 8, "UserID")
        update.Parameters.Add("@DisbursementDetailsID", SqlDbType.BigInt, 8, "DisbursementDetailsID")


        '==== Error: object reference not set to an instance of an object ====
        sqladapter.DeleteCommand = delete
        sqladapter.InsertCommand = insert
        sqladapter.UpdateCommand = update
        '======================================================================

        sqladapter.MissingSchemaAction = MissingSchemaAction.AddWithKey

    End Using

End Sub

按钮保存代码:

 sqladapter.Update(dtable)

请帮忙。我被困住了。谢谢。

4

2 回答 2

1

当然可以使用现有的存储过程。

使用类似这样的代码(这是 C# - 但转换为 VB.NET 应该很容易):

 // create a new SqlCommand as your "insert" command
 da.InsertCommand = new SqlCommand("dbo.YourInsertStoredProcNameHere", con);

 // define it to be a stored procedure
 da.InsertCommand.CommandType = CommandType.StoredProcedure;

 // add any parameters needed...
 da.InsertCommand.Parameters.AddWithValue(....);

UpateCommand对和做同样的事情DeleteCommand

旁注:您不应该您的存储过程使用sp_前缀。Microsoft 已保留该前缀供自己使用(请参阅命名存储过程,并且您确实会在将来某个时候冒名称冲突的风险。这对您的存储过程性能也很不利。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本没有前缀!

于 2013-10-28T14:56:08.310 回答
0

您可以使用以下代码并注意:字符串是我的程序名称

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Try
        Dim str As String = "server=.;UID=sa;PWD=123456;database=MYdatabase"
        Dim con As New SqlConnection(str)
        Dim com As String = "proc_Ticket_Details"
        Dim Adpr As New SqlDataAdapter(com, con)
        Dim ds As New DataSet()
        Adpr.Fill(ds)
        DataGridView1.DataSource = ds.Tables(0)
        'MessageBox.Show("View Data here")

    Catch ex As Exception
        MessageBox.Show("ERROR: " & ex.Message)            
    End Try
End Sub
于 2019-02-12T07:18:46.207 回答