Kann mir jemand helfen? Bei folgendem Code bekomme ich zur Laufzeit bei der markierten Stelle eine Exception:
private void button1_Click(object sender, EventArgs e)
{
MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection("Server=localhost; Database=MDB; UserId=xxxx; Password=xxxx");
string sql = "INSERT INTO artists " +
" VALUES (null, ?name); " +
"SELECT ?id = LAST_INSERT_ID();";
MySql.Data.MySqlClient.MySqlCommand result = new MySql.Data.MySqlClient.MySqlCommand(sql, conn);
conn.Open();
result.Parameters.Add("?name", MySql.Data.MySqlClient.MySqlDbType.VarChar, 45, "name").Direction = ParameterDirection.InputOutput;
result.Parameters.Add("?id", MySql.Data.MySqlClient.MySqlDbType.Int32, 0, "id").Direction = ParameterDirection.Output;
result.Parameters["?name"].Value = "Test";
result.ExecuteNonQuery();
MessageBox.Show(result.Parameters["?id"].Value.ToString()); //<= Fehler, weil Value == null
}
Sowas funktioniert IMHO nur bei SPs. Mach's doch so (Syntax nicht überprüft, aber so in der Art geht's):
MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection("Server=localhost; Database=MDB; UserId=xxxx; Password=xxxx");
string sql = "INSERT INTO artists " +
" VALUES (null, ?name); " +
"SELECT LAST_INSERT_ID();";
MySql.Data.MySqlClient.MySqlCommand result = new MySql.Data.MySqlClient.MySqlCommand(sql, conn);
conn.Open();
result.Parameters.Add("?name", MySql.Data.MySqlClient.MySqlDbType.VarChar, 45, "name").Direction = ParameterDirection.InputOutput;
result.Parameters["?name"].Value = "Test";
int id = (int) result.ExecuteScalar();
Erst einmal Danke für die schnelle Antwort!
Ich muss zugeben, dass ich das Beispiel zum Posten vereinfacht habe. In Wirklichkeit ist das erstellte MySqlCommand dem UpdateCommand eines DataAdapters zugewiesen. Damit sollen Änderungen in einem DataSet an die Datenbank übermittelt und die automatisch generierten ID-Werte für jede neue Spalte wieder ausgelesen werden.
Original von x86fanboy
Sowas funktioniert IMHO nur bei SPs.
Wirklich? also bei MS SQL scheint es zu funktionieren (steht so zumindest in meinem ADO.NET Buch)
Hier ein Teil des original-Codes für den MS SQL-Server:
strSQL = "INSERT INTO Orders (CustomerID, OrderDate) " +
" VALUES (@CustomerID, @OrderDate);" +
"SELECT @OrderID = SCOPE_IDENTITY()";
da.InsertCommand = new SqlCommand(strSQL, cn);
da.InsertCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID").Direction = ParameterDirection.InputOutput;
da.InsertCommand.Parameters.Add("@OrderDate", SqlDbType.DateTime, 0, "OrderDate").Direction = ParameterDirection.InputOutput;
da.InsertCommand.Parameters.Add("@OrderID", SqlDbType.Int, 0, "OrderID").Direction = ParameterDirection.Output;
da.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
Wirklich? also bei MS SQL scheint es zu funktionieren (steht so zumindest in meinem ADO.NET Buch)
Das war mir nicht bewusst. Ich kann später mal schauen ob dass auch mit MySQL funktionieren sollte. Benutzt du den neuesten Connector (5.0.2)?
Hallo!
Ich hab's gelöst, indem ich die Abfrage der ID im Row-Updated EventHandler des DataAdapters vornehme
da.RowUpdated += new MySqlRowUpdatedEventHandler(da_RowUpdated);
...
void da_RowUpdated(object sender, MySqlRowUpdatedEventArgs e)
{
if (e.Status == UpdateStatus.Continue && e.StatementType == StatementType.Insert) {
MySqlCommand idComm = new MySqlCommand("SELECT LAST_INSERT_ID()", e.Command.Connection);
e.Row["id"] = idComm.ExecuteScalar();
e.Row.AcceptChanges();
}
}