ID eines neu angelegten Datensatzes auslesen



  • Hallo,

    ich lege mit folgenden Zeilen einen neuen Eintrag in einer DB an (klappt auch wunderbar):

    OleDbCommand ^befehl;
    OleDbDataReader ^leser;
    befehl->CommandText = "INSERT INTO .....)";
    leser = befehl->ExecuteReader();
    

    jetzt würde ich gerne die für diesen Datensatz vergebene ID erfahren und weiterverwenden. Gibt es dazu eine passende Methode des OleDbDataReaders diese in Erfahrung zu bringen?

    Gruß Solick



  • Ich kenne das nur so dass man non-standard SQL Befehle verwendet um an die ID ranzukommen.
    In T-SQL z.B. so:

    befehl->CommandText = "INSERT ...; SELECT SCOPE_IDENTITY();"
    ...
    


  • Was ist denn bitte T-SQL??

    Gilt das auch für MS-SQL?

    Dann müsste die Methode für den Reader aber so überladen sein, dass sie jeden möglichen Dateityp zurückgeben kann oder?



  • solick schrieb:

    Was ist denn bitte T-SQL??
    Gilt das auch für MS-SQL?

    T-Sql ist der Dialekt der im MS-SQL eingesetzt wird.

    solick schrieb:

    Dann müsste die Methode für den Reader aber so überladen sein, dass sie jeden möglichen Dateityp zurückgeben kann oder?

    Wieso verwendest Du überhaupt ExecuteReader()?. Das wäre doch ein Fall für ExecuteNonQuery(); Und jetzt verwendest Du eben ExecuteScalar();, das übergibt ein Objekt (Ich glaube Decimal oder so).



  • Ah danke, werd ich nachher gleich mal ausprobieren.

    ExecuteReader hab ich ebend wg. eines möglichen Rückgabewerts genommen...



  • ...ExecuteScalar()...

    Cool, die Funktion kannte ich garnicht 🙂
    (Was vermutlich daran liegt dass ich immernocht mit ADO-ohne-.NET arbeite(n muss))



  • hmm..

    bekomme die Fehlermeldung: "Zeichen nach Ende der SQL-Anweisung gefunden".

    befehl->CommandText = "INSERT INTO stammdaten (projektname, kunde, ort, minwert, maxwert, dimbezauswert) VALUES
    ('" + tb_projekt->Text->ToString() + "','" + tb_firma->Text->ToString() +
     "','" + tb_ort->Text->ToString() + "'," + wert + "," + 
    umud_maximal->Value.ToString() + "," + cbwert + "); 
    SELECT SCOPE_IDENTITY();";
    Object ^retobj;
    retobj = befehl->ExecuteScalar();
    

    Muss man für Nutzung des T-SQL Dialekts noch was anderes ausser System::Data::OleDb einbinden?

    Gruß Solick



  • solick schrieb:

    bekomme die Fehlermeldung: "Zeichen nach Ende der SQL-Anweisung gefunden".

    Zumindest bei MS Access wäre diese Fehlermeldung richtig (Da diese "DB" keine weiteren Anweisungen zulässt). Da ich selbst noch nicht mit ADO.Net gearbeitet habe, tippe ich im Zusammenhang mit dem SQL Server auf einen falschen Provider (Ich nehme an das es für SQL Server neben OleDB einen speziellen gibt).



  • ah ok. In der Tat nutze ich MS-Access und keinen SQL-Server. Dann muss ich es wohl doch altbewährt machen und ne zweite Abfrage hinterherschicken um die neue ID auszulesen...

    Danke für Eure Hinweise.

    Gruß Solick



  • Access kennt soweit ich weiss den Befehl SCOPE_IDENTITY() nicht.
    Musst du in der MSDN nachgucken wie man das mit Access üblicherweise macht.
    Theoretisch ginge natürlich ein "SELECT max(ID) ...", aber das is ziemlich grausig.



  • Ich hab einfach direkt danach eine Abfrage nach den werten gemacht, die ich gerade eingetragen habe und mir die ID ausspucken lassen. Die Speicher ich in einer Variablen ab und kann sie so weiterverwenden. Es ging mir nur darum, dass ich direkt die eingetragenen Daten in einer Maske aufrufe, und dafür brauchte ich die ID zum Übergeben an die Funktion. Klappt so super, sind halt zwei Aufrufe der DB, aber nicht so schlimm...


Anmelden zum Antworten