我是vb.net的新手。请多多包涵。我想学习如何在Datagridview
中插入,更新和删除数据。到目前为止,我学到了最好的方法是将DatagridView
绑定到DataTable
?要求是使用存储过程。我不允许直接访问数据库表。
我的公共变量:
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
我的代码来自Load:
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)
问题:我无法弄清楚如何让SqlCommandBuilder
发挥作用。有没有办法覆盖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_Click代码:
cb = New SqlCommandBuilder(da)
da.Update(ds, "Disbursements")
我正在尝试通过使用storedprocedures创建自己的插入,更新和删除命令来复制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)
请帮忙。我被卡住了。感谢。
答案 0 :(得分:0)
当然可以使用现有的存储过程。
使用类似这样的代码(这是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_
前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实在将来的某个时候冒着名字冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免使用sp_
并使用其他东西作为前缀 - 或者根本不使用前缀!
答案 1 :(得分: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