Hallo,
Ich habe einen Data Adapter mit folgendem SQL Statement geschrieben:
INSERT INTO Configurations
(AlarmOn, Activated, UserName, datetime, TypeId)
VALUES (@AlarmOn, @Activated, @UserName, { fn NOW() }, @TypeId);
SELECT IDENT_CURRENT('Configurations');
Der C# Code dazu:
DeviceConfigurationTableAdapter configTa = new DeviceConfigurationTableAdapter();
int configId = Convert.ToInt32(configTa.Insert(alarmOn, activated, UserName, typeId));
Der Data Adapter sollte eigentlich die aktuelle ConfigurationId der Tabelle zurück geben. Leider bekomme ich immer den Wert 1 zurück.
Was mache ich falsch??
Danke für jeden Tip!
Hallo Kuehner,
soweit ich weiß, gibt die Insert-Methode nicht die IDENTITY zurück, sondern lediglich die beeinflussten Zeilen. Deswegen bekommst Du auch immer 1 zurück, da das Insert-Statement eine Zeile erstellt hat.
Die aktuelle IDENTITY musst Du glaube ich manuell holen.
Gruß,
Fabian
"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)
Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…
Blog: www.fabiandeitelhoff.de
Danke! Habs dann jetzt halt mit einer Stored Procedure gemacht:
CREATE PROCEDURE dbo.InsertConfiguration
(
@AlarmOn bit = 1,
@Activated bit = 0,
@UserName varchar(MAX),
@TypeId int,
@ControllerId int = 0,
@NewId int OUTPUT
)
AS
INSERT INTO Configurations (AlarmOn, Activated, UserName, datetime, TypeId, ControllerId)
VALUES (@AlarmOn, @Activated, @UserName, { fn NOW() }, @TypeId, @ControllerId);
set @NewId = SCOPE_IDENTITY();
RETURN
string connectionString = ConfigurationManager.ConnectionStrings["matcdbConnection"].ConnectionString;
SqlConnection sqlConnection = new SqlConnection(connectionString);
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.CommandText = "InsertConfiguration";
sqlCommand.Parameters.Add(new SqlParameter("@AlarmOn", alarmOn));
sqlCommand.Parameters.Add(new SqlParameter("@Activated", activated));
sqlCommand.Parameters.Add(new SqlParameter("@UserName", userName));
sqlCommand.Parameters.Add(new SqlParameter("@TypeId", typeId));
sqlCommand.Parameters.Add(new SqlParameter("@ControllerId", controllerId));
sqlCommand.Parameters.Add(new SqlParameter("@NewId", SqlDbType.Int, 4, ParameterDirection.Output, false, 0, 50, "NewId", DataRowVersion.Default, null));
sqlConnection.Open();
sqlCommand.ExecuteNonQuery();
int configId = (int)sqlCommand.Parameters["@NewId"].Value;
sqlConnection.Close();
Das wäre auch einfacher gewesen, wenn Du gleich selber ExecuteScalar für deine
erste abfrage benutzt hättest.