Hallo,
ich bin über das folgende Problem gestolpert, für das ich keine zufriedenstellende Lösung finde. Vielleicht habt ihr ja eine Idee, wie man das bewerkstelligen kann.
Ich soll ein Programm schreiben, mit dem man irgendwelche Daten auf einem SQL-Server verwalten kann. Dazu gehört normalerweise das Lesen und das Schreiben von Daten. Für den schreibenden Zugriff habe ich mir eine Funktion geschrieben, die beliebige INSERT- oder UPDATE-Statements ausführen und als Rückgabewert die Anzahl der betroffenen Datensätze liefern soll. Die Funktion sieht (bereinigt um die Fehlerbehandlung) so aus:
Public Function ExecuteCommand(ByVal oCN As SqlConnection, ByVal sQuery As String) As Integer
Dim oCommand As New SqlCommand
Dim iResult As Integer
oCommand.CommandText = sQuery
oCommand.CommandType = CommandType.Text
oCommand.Connection = oCN
iResult = oCommand.ExecuteNonQuery()
oCommand.Dispose()
Return m_iResult
End Function
Die übergebene Connection oCN ist bereits geöffnet.
Wenn ich diese Funktion nun innerhalb einer Transaktion aufrufe, bekomme ich die Meldung "ExecuteNonQuery erfordert, dass der Befehl über eine Transaktion verfügt, wenn die dem Befehl zugewiesene Verbindung eine ausstehende lokale Verbindung ist. Die Transaction-Eigenschaft des Befehls wurde nicht initialisiert."
Wenn ich in diese Funktion nun noch eine Transaktion einbaue, sagt er mir aber wiederum, dass parallele Transaktionen nicht unterstützt werden.
Die externe Transaktion kann ich auch nicht weglassen, weil der mit dieser Funktion auszuführende INSERT oder UPDATE ja nicht der einzige sein muss, der innerhalb dieser Transaktion laufen soll.
Wenn ich aus den Daten der übergebenen Connection eine lokale neue Connection erstelle, würde es wahrscheinlich funktionieren, nur benötige ich dafür natürlich das Kennwort des SQL-Benutzers, da dieses ja richtigerweise nicht aus dem Connection-Objekt abrufbar ist. Ich finde es nun aber mehr als unschön, mir dass Kennwort zu merken, um dieses dann bei jedem INSERT oder UPDATE erneut anzugeben (eine neue Eingabe durch den Anwender scheidet erst recht aus).
Ich stehe zur Zeit echt auf dem Schlauch, wie sich Microsoft das gedacht hat.
Und bevor es jemand vorschlägt... nein, ich kann nicht mit integrierter SQL-Sicherheit arbeiten, es müssen SQL-Benutzer mit eigenem Kennwort sein.
Ich hoffe, ihr könnt mir helfen und mir den richtigen Weg weisen. Vielen Dank im Voraus.
ich bin über das folgende Problem gestolpert, für das ich keine zufriedenstellende Lösung finde. Vielleicht habt ihr ja eine Idee, wie man das bewerkstelligen kann.
Ich soll ein Programm schreiben, mit dem man irgendwelche Daten auf einem SQL-Server verwalten kann. Dazu gehört normalerweise das Lesen und das Schreiben von Daten. Für den schreibenden Zugriff habe ich mir eine Funktion geschrieben, die beliebige INSERT- oder UPDATE-Statements ausführen und als Rückgabewert die Anzahl der betroffenen Datensätze liefern soll. Die Funktion sieht (bereinigt um die Fehlerbehandlung) so aus:
Public Function ExecuteCommand(ByVal oCN As SqlConnection, ByVal sQuery As String) As Integer
Dim oCommand As New SqlCommand
Dim iResult As Integer
oCommand.CommandText = sQuery
oCommand.CommandType = CommandType.Text
oCommand.Connection = oCN
iResult = oCommand.ExecuteNonQuery()
oCommand.Dispose()
Return m_iResult
End Function
Die übergebene Connection oCN ist bereits geöffnet.
Wenn ich diese Funktion nun innerhalb einer Transaktion aufrufe, bekomme ich die Meldung "ExecuteNonQuery erfordert, dass der Befehl über eine Transaktion verfügt, wenn die dem Befehl zugewiesene Verbindung eine ausstehende lokale Verbindung ist. Die Transaction-Eigenschaft des Befehls wurde nicht initialisiert."
Wenn ich in diese Funktion nun noch eine Transaktion einbaue, sagt er mir aber wiederum, dass parallele Transaktionen nicht unterstützt werden.
Die externe Transaktion kann ich auch nicht weglassen, weil der mit dieser Funktion auszuführende INSERT oder UPDATE ja nicht der einzige sein muss, der innerhalb dieser Transaktion laufen soll.
Wenn ich aus den Daten der übergebenen Connection eine lokale neue Connection erstelle, würde es wahrscheinlich funktionieren, nur benötige ich dafür natürlich das Kennwort des SQL-Benutzers, da dieses ja richtigerweise nicht aus dem Connection-Objekt abrufbar ist. Ich finde es nun aber mehr als unschön, mir dass Kennwort zu merken, um dieses dann bei jedem INSERT oder UPDATE erneut anzugeben (eine neue Eingabe durch den Anwender scheidet erst recht aus).
Ich stehe zur Zeit echt auf dem Schlauch, wie sich Microsoft das gedacht hat.
Und bevor es jemand vorschlägt... nein, ich kann nicht mit integrierter SQL-Sicherheit arbeiten, es müssen SQL-Benutzer mit eigenem Kennwort sein.
Ich hoffe, ihr könnt mir helfen und mir den richtigen Weg weisen. Vielen Dank im Voraus.
Comment