Insert Update Delete Datagridview über SQL Server gespeicherte Prozeduren?
Ich bin neu vb.net. Bitte Geduld mit mir. Ich würde gerne lernen, wie Sie einfügen, aktualisieren, löschen von Daten in einer Datagridview
. Bisher habe ich gelernt, ist der beste Ansatz, um dieses zu binden, die DatagridView
zu einem DataTable
? Die Voraussetzung ist, um gespeicherte Prozeduren verwenden. Ich darf nicht direkt auf Datenbank-Tabellen.
Meine öffentlichen Variablen:
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
Meinem code unten aus dem Laden:
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
Meine Schaltfläche speichern code:
da.Update(dt)
Frage: ich kann nicht herausfinden, einen Weg, wie man das SqlCommandBuilder
zu arbeiten. Gibt es eine Möglichkeit für mich, zu überschreiben SqlCommandBuilder
meinen vorhandenen einfügen, aktualisieren und löschen von gespeicherten Prozeduren?
Ich denke ich habe eine Lösung gefunden: (aber ich verstehe wirklich nicht, die Nebenwirkungen auf der Datenbank-Seite.) Da SQLCommandBuilder aus der insert -, update -, delete-Befehle für mich bedeutet es, ich muss nicht mehr meine bestehende einfügen, aktualisieren und löschen gespeicherte Prozeduren? Direct access-Tabelle ist nicht erlaubt, in meine Firma für die ich arbeite.
Unter meinem aktualisierten code:
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 Code:
cb = New SqlCommandBuilder(da)
da.Update(ds, "Disbursements")
Ich bin versucht zu duplizieren des SQLCOMMANDBUILDER-durch meine eigene insert -, update -, delete-Befehle mit storedprocedures. Ich bin stecken mit diesem Fehler auf buttonSave_Click: sqladapter.Update(dtable) FEHLER: "parallelitätsverletzung: der UpdateCommand betroffen 0 der erwarteten 1 Datensätze"
Unter meinem aktualisierten code:
Globale Variablen:
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
Form Load-Code:
LoadDisbursementDetails(intDisbursementID)
myownSqlCommandBuilder(intDisbursementID)
LoadDisbursementDetails Sub-Code:
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 Sub-Code:
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
Taste Speichern-Code:
sqladapter.Update(dtable)
Bitte helfen. Ich bin stecken. Danke.
- habe es entfernt die using-Anweisung myownSqlCommandBuilderCode und überarbeitete mein update storedproc zu lösen, das concurrency-problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sicher, dass Sie können verwenden Sie die vorhandene gespeicherte Prozedur.
Verwenden Sie code so etwas wie dieses (das ist C#, aber sollte ein Kinderspiel zu konvertieren VB.NET):
Tun die gleiche Sache für die
UpateCommand
undDeleteCommand
.Seite Hinweis: sollten Sie nicht verwenden Sie die
sp_
Präfix für Ihre gespeicherten Prozeduren. Microsoft hat vorbehalten, die mit einem Präfix für den eigenen Gebrauch (siehe Benennen von Gespeicherten Prozeduren), und Sie laufen Gefahr, einen name-clash-irgendwann in der Zukunft. Es ist auch schlecht für die gespeicherte Prozedur performance. Es ist am besten, einfach zu vermeidensp_
und verwenden Sie etwas anderes als ein Präfix - oder kein Präfix an alle!SqlConnection
für diesen Befehl. Auch: Nein, Sie nicht haben, um in einer Schleife die Daten der grid-Ansicht, die zugrunde liegendenDataTable
wird verfolgen, welche Zeilen wurden Hinzugefügt, aktualisiert, gelöscht und verwenden Sie die entsprechenden Befehle aus derSqlDataAdapter
um die operation zu behandeln, wie gebraucht.Können Sie verwenden Sie folgenden code, und Beachten Sie:String ist mein name der Prozedur