VisualBasic ID-Rückgabe beim INSERT im SQL Server Compact 4.0

danieljena

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
418
Hallo Leute,
ich bin gerade dabei ein Tool zu entwickeln, welches im Hintergrund eine SQL Server Compact 4.0 Datenbank nutzt.
Um den reibungslosen Ablauf des Programms zu gewährleisten, muss ich (eigentlich) nach einem INSERT gleich den aktuellen ID-Wert abfragen.
Nur leider versteht der SqlCeCommand bei mir keine 2 Anweisungen in einer.

Code:
com.CommandText = "insert into test (name1) values ('lisa'); SELECT @@IDENTITY()"
id = Convert.ToString(com.ExecuteScalar)

Hierbei bekomme ich immer einen Fehler beim "Token Select"

Laut dieser Seite: http://msdn.microsoft.com/en-us/library/bb896140.aspx
sind mehere SQL-Anweisungen möglich ("If you want to run multiple queries simultaneously ...").

Was mache ich falsch?

mfg
danieljena
 
... you must include a new line character for each statement and a semicolon at the end of each statement.

New line character fehlt und Semikolon fehlt auch. Unabhängig davon würde ich trotzdem zwei einzelne Statements verwenden, allein der Fehlerbehandlung wegen.
 
das hatte ich auch bereits versucht, funktioniert auch nicht
Code:
com.CommandText = "insert into test (name1) values ('lisa');" & Environment.NewLine & "SELECT @@IDENTITY();" & Environment.NewLine

zwei getrennte Statements:
Könnte ich auch verwenden, die Wahrscheinlichkeit, dass ein weiterer Nutzer ein Insert absendet, bevor ich den IDENTITY lesen konnte ist zwar gering, aber sie ist da.

Das Progi ist auf mehreren Clients verfügbar und die Datenbank liegt später auf einen Netzlaufwerk.
 
Hi,

bin mir nicht sicher, wie der SQL Express mit sowas umgeht, aber könnte man die entsprechende Tabelle nicht locken und / oder mit einer Transaction arbeiten?

VG,
Mad
 
Ich verwende den SQL Server Compact nicht den Express.
Locken fällt leider aus, da definitiv mehrere Nutzer drauf zugriffen müssen, "zur selben Zeit".
Ne Transaktion wäre noch eine Idee, da habe ich aber keine Ahnung wie sich das im verhält, wenn diese T.Aktion gerade arbeitet und ein anderer User lesen möchte.
 
@@IDENTITY() bezieht sich auf deine Session, da funkt keiner dazwischen.
 
@r0b0t

Habe ich das richtig verstanden?

Angenommen wir haben 2 Clients.

Client 1 setzt Insert ab
Client 2 setzt Insert ab
Client 1 macht @@IDENTITY() und bekommt den Index seiner Insert-Anweisung zurück und nicht vom dem Datensatz von Client 2.

(Die drei Schritte im Zeitlichenablauf)
 
Kannst du doch einfach ausprobieren im Debugger an zwei Clients oder zwei Sessions mit Pausefunktion an einem Client aufrufen.
 
also ich habe nun mal folgendes probiert:

Client 1, in der IDE, geht bis um schreiben der Select Identity, pausiert dann.
Client 2, startet normal und schreibt einen DS und ruft ID ab.
Client 1, läuft weiter und tatsächlich wird der ID vor dem DS von Client 2 ausgegeben, also der richtige für Client 1.

Es hat für mich den Anschein, dass der SQL Server CE intern die Verbindungen koordiniert und diese aber gegenseitig nichts voneinander wissen, eben eine richtige/einfache Mehrbenutzerdatenbank.
Ergänzung ()

so, habe nun das gleiche noch mal mit drei Instanzen probiert, auch da funktioniert es.
Problemfall gelöst, danke.
 
Zurück
Oben