Vorbereiten einer Anwendung, die von ungefähr 40 Benutzern im Büro mit lokalem SQL Server im lokalen Netzwerk verwendet wird. Anwendung in VB.NET entwickelt. Ich habe bereits einige Dokumentationen gelesen, möchte aber direkt von Ihrer Seite etwas über den Zugriff auf Daten erfahren.Zugriff auf mehrere SQL Server-Datenbanken
Dies ist eine Winforms-App und ich frage mich, ob Transaktionen, die ich gerade benutze gerade genug Daten zu schützen, wenn ein Benutzer einige Daten verwendet und andere es in der gleichen Zeit ändert, würde Transaktion schützen es? Kann mir jemand kurz erklären, wie es ist?
Beispiel für SQL-Transaktion verwenden, die ich in meiner Anwendung
Dim result As Boolean = True
Dim strcon = New AppSettingsReader().GetValue("ConnectionString", GetType(String)).ToString()
Using connection As New SqlConnection(strcon)
'-- Open generall connection for all the queries
connection.Open()
'-- Make the transaction.
Dim transaction As SqlTransaction
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
Try
For Each sentId In pSentsId
'-- Insert aricle to Article's table (T_Artikel) and get inserted row id to use it in other queries
Using cmd As New SqlCommand("INSERT INTO T_Sentence_SubSec_SecKatSubKat_SubSubKat (FK_Sentence_ID, FK_SubSec_SecKatSubKat_SubSubKat) VALUES (@FK_Sentence_ID, @FK_SubSec_SecKatSubKat_SubSubKat)", connection)
cmd.CommandType = CommandType.Text
cmd.Connection = connection
cmd.Transaction = transaction
cmd.Parameters.AddWithValue("@FK_Sentence_ID", sentId)
cmd.Parameters.AddWithValue("@FK_SubSec_SecKatSubKat_SubSubKat", SubSec_SecKatSubKat_SubSubKat)
cmd.ExecuteScalar()
End Using
Next
transaction.Commit()
Catch ex As Exception
result = False
'-- Roll the transaction back.
Try
transaction.Rollback()
Catch ex2 As Exception
' This catch block will handle any errors that may have occurred
' on the server that would cause the rollback to fail, such as
' a closed connection.
'Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType())
'Console.WriteLine(" Message: {0}", ex2.Message)
End Try
End Try
End Using
Return result
Sie erstellen 'SqlCommand' in jeder Schleife. Das ist schlechte Praxis. Erstelle 'SqlCommand' einmal und füge Parameter außerhalb der Schleife hinzu. Setze Parameterwerte und ** 'ExecuteNonQuery' ** in der Schleife. Fangen Sie zunächst 'SqlException' ein. –
Es ist nicht viel wert, eine einzelne INSERT-Anweisung in eine Transaktion einzufügen. Es gibt bereits eine implizite Transaktion beim Einfügen von Daten. Ich denke, was Sie fragen, ist Nebenläufigkeit oder möglicherweise Deadlock-Probleme. Die Verwendung einer Transaktion um eine Insert-Anweisung herum wird dort nicht viel bewirken. Als Randnotiz sollten Sie vorsichtig sein, AddWithValue in Pass-Through-Abfragen wie folgt zu verwenden. Der Datentyp wird manchmal falsch interpretiert. http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-ready/ –
Ich glaube, das läuft, wenn ein anderer Benutzer einen Datensatz mit den gleichen Schlüsselwerten eingefügt hat , dann würde es auslösen (* think * dbConcurrencyException). Wie geschrieben, sollte Ihr Ausnahmebehandler ausgelöst und zurückgesetzt werden, aber dies ist möglicherweise nicht das, was Sie vorhaben. –