2009-06-19 4 views
1

Ich verwende eine XSD-Datei in meiner Visual Studio 2008 Pro-Lösung, und ich habe ein Problem mit der ExecuteMode-Eigenschaft der Tableadapter-Methoden zurücksetzen. Ich habe eine Handvoll von Insert-Methoden in mehreren Adaptern erstellt. Ich benutze "SELECT SCOPE_IDENTITY()" nach dem Einfügen von SQL, um die ID des neuen Datensatzes zurückzugeben. Ich aktualisiere dann die ExecuteMode-Eigenschaft zu Scalar (von NonQuery). Hin und wieder merke ich, dass der ExecuteMode zurück zu NonQuery wechselt. Ich kann nicht herausfinden warum. Ich habe während meiner Arbeit kein Muster bemerkt, das zu der Veränderung führt. Jeder von euch Kollegen. NET Geeks haben irgendwelche Ideen?TableAdapter-Methode behält Zurücksetzen auf NonQuery von Scalar

+0

Können Sie mir Ihre Anfrage zeigen ??? –

+0

Ich glaube nicht, dass die eigentliche Abfrage das Problem ist, weil dies mit vielen meiner einfügen Abfragen über die xsd passiert ist. – Brian

Antwort

0

Ich habe dies entweder als ein Fehler in VS oder eine falsche Umgebung einkalkuliert. Ich konnte nicht konsistent replizieren, was passiert ist, und ich konnte keine Lösung finden. Es war sehr zufällig und ich kann mich nicht erinnern, dass es mehr als eine Handvoll Probleme gab.

-1

Sie sollten eine SQL verwenden, die die Werte einfügt und den neuen Datensatz statt eines SQL auswählt, der einen skalaren Wert zurückgibt, um die ID zu erhalten.

Der "TableAdapter-Konfigurationsassistent" erstellt diesen SQL-Typ, wenn Sie im Schritt "Wählen Sie einen Befehlstyp" "Neue Speicherprozedur erstellen" wählen und dann im Schritt "SQL-Anweisung für den Speichervorgang auswählen" die Option "Erweitert" wählen Optionen "markieren" Erzeugen Einfügen, Aktualisieren ... "und" Aktualisieren der Datentabelle ". Vervollständige den Rest des Assistenten mit den Namen der Nachrichtenprozeduren.

Die SQL erzeugt ist so etwas wie dieses

INSERT INTO [apptbl] ([Id]) VALUES (@Id); 
SELECT Id FROM apptbl WHERE (Id = SCOPE_IDENTITY()) 

die Tableadapter mit ...

public int insert_newObj() 
    { 
      objDataTable dt = new objDataTable(); 
      objRow dr = dt.NewObjRow();   

      // assign values to others fields, except the id... 

      dt.AddObjRow(dr); 

      Adapter.Update(dt); 

      return dr.Id; 
    } 

Beachten Sie, dass datarow Objekt wegen der „durch den Adapter“ mit der neuen ID gefüllt werden zweite SQL-Anweisung (SELECT ...) in der Speicherprozedur.

Nun, ich bin nicht sicher, ob es helfen könnte, weil ich nicht Ihre SQL sah, aber das ist eine sehr häufige Möglichkeit, die ID zu bekommen.