none
Commandbuilder RRS feed

  • 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



    Samstag, 13. August 2011 14:39

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

    Sonntag, 14. August 2011 12:33

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
    Samstag, 13. August 2011 15:23
    Moderator
  • ähm, 3 Felder nur eins ein Key-Feld nämlich das Feld ID ja ist Primärkey. Das es besser ist sie selbst aufzubauen sehe auch so, nur die Frage bleibt was soll das sein ?=1
    Samstag, 13. August 2011 15:29
  • 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

    Samstag, 13. August 2011 17:22
  • 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

    Sonntag, 14. August 2011 11:14
  • 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

    Sonntag, 14. August 2011 12:33
  • Verstanden, danke ...

    schau dir bitte noch meine andere Frage an in Bezug auf den Commandbuilder ...

    danke mfg eem monarch

    Sonntag, 14. August 2011 12:40