Benutzer mit den meisten Antworten
Commandbuilder

Frage
-
Hallo Experten,
ich versuche gerade hinter die ganze Logik von DataAdapter und kollegen zu kommen und hätte dazu eine Frage. In dem folgenden Code wird ein Dataadapter mit einer Accessdatenbank verbunden. Die Tabelle ist simple und mit einem KeyFeld (ID: kein Autowert) versehen. Wenn ich mir nun den autom erstellte UpdateCommand anschaue sieht der wie folgt aus:
UPDATE [Translate_Objekte_Detail_DoIt] SET [Id] = ?, [IdObjektSeite] = ?, [Orginal] = ? WHERE (([Id] = ?) AND ((? = 1 AND [IdObjektSeite] IS NULL) OR ([IdObjektSeite] = ?)))
Das kann ich bis zu "... where ID=? " verstehen, ab dann nicht mehr. Was soll denn das "?=1" sein und warum? und warum ein where Vergleich der Spalte IDObjektSeite, dabei handelt es um ein einfaches Text-Feld ohne Schlüsselinformation oder sonst was in der Richtung. Wenn man berücksichtig, das das ID-Feld kein Autowert besitzt und somit auch änderbar ist. müste nach meinen Verständis das Update-Statement wie folgt aussehen.
UPDATE [Translate_Objekte_Detail_DoIt] SET [Id] = ?, [IdObjektSeite] = ?, [Orginal] = ? WHERE ([Id] = ?)
( und warum sich hier dauert die schriftgröße ändert und sich nicht mehr anpassen läst, verstehe ich auch nicht)
Imports System.Data.OleDb Public Class Form1 Dim DBOleDbCon As New OleDbConnection Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load DBOleDbCon.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Entwicklung\Monarch_HTML_Translater\Monarch_HTML_Translater\bin\Debug\WWBCompilerMonarch.mdb" DBOleDbCon.Open() Dim DBOleAdapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT Id, IdObjektSeite, Orginal FROM Translate_Objekte_Detail_DoIt", DBOleDbCon) Dim DBOleBuilder As OleDbCommandBuilder = New OleDbCommandBuilder(DBOleAdapter) DBOleBuilder.QuotePrefix = "[" DBOleBuilder.QuoteSuffix = "]" Dim Dataset As DataSet = New DataSet DBOleAdapter.Fill(Dataset, "Translate_Objekte_Detail_DoIt") Debug.Print(DBOleBuilder.GetUpdateCommand.CommandText) End Sub End Class
Antworten
-
Hallo,
das "?" steht hier für einen DbParameter mit gesetzter SourceColumnNullMapping Eigenschaft.
Auf der Serverseite kann man das nicht regeln, da die nichts über den Aufbau des DataSet weiß,
das kann via FillSchema abgeleitet sein, muss aber nicht -
unabhängig davon, dass die Jet sowieso keine Serverseite hat.Gruß Elmar
- Als Antwort markiert Monarch-Falter Sonntag, 14. August 2011 12:40
Alle Antworten
-
Hi,
ist deine Spalte ID der Primärschlüssel der Tabelle? Falls ja, ist das in Access auch so hinterlegt?
Warum der CommandBuilder das so "komisch" aufbaut, kann ich dir, ohne deine Tabellenstruktur zu sehen, nicht sagen. Aber es empfiehlt sich den meisten Fällen eh, die SQL Statements selbst zu schreiben und die eben nicht erzeugen zu lassen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo,
da ist überhaupt nichts "komisch" ;-)
Das nennt sich vollständige Parallelität (Optimistic Concurrency).
Der Vergleich ist für Nullwerte erforderlich, wobei dazu ein Parameter verwendet wird.
Was wiederum Weiterverwendung des Befehls ermöglicht - wichtig für solche RDBMS
die SQL Anweisung cachen (wie der SQL Server, Jet ist eher vergesslich).Um auf "der letzte gewinnt" umzuschalten, setze die ConflictOption auf OverwriteChanges,
dann wird nur der Primärschlüssel (hier die ID) verwendet.
Problem ist nur, wenn mehrere Leute darauf zugreifen, u. U. vorherige Änderungen überschrieben werden.Gruß Elmar
-
Servus Elmar,
das mit der Vollständigen Parallelität ist mir klar. Obwohl ich auch der Meinung bin, das man das besser auf Serverseite regelt, aber das ist ein anderes Thema. Ich teste halt mal rum mit Access. Nur die Frage bleibt was soll das "?=1" sein im dem oben gelistenden Code.
mfg eem Monarch
-
Hallo,
das "?" steht hier für einen DbParameter mit gesetzter SourceColumnNullMapping Eigenschaft.
Auf der Serverseite kann man das nicht regeln, da die nichts über den Aufbau des DataSet weiß,
das kann via FillSchema abgeleitet sein, muss aber nicht -
unabhängig davon, dass die Jet sowieso keine Serverseite hat.Gruß Elmar
- Als Antwort markiert Monarch-Falter Sonntag, 14. August 2011 12:40