Laden...

MySQL 5: LAST_INSERT_ID über Parameter abrufen

Erstellt von Icarus666 vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.021 Views
Icarus666 Themenstarter:in
153 Beiträge seit 2006
vor 17 Jahren
MySQL 5: LAST_INSERT_ID über Parameter abrufen

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
    }


X
40 Beiträge seit 2005
vor 17 Jahren

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();


Icarus666 Themenstarter:in
153 Beiträge seit 2006
vor 17 Jahren

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;

X
40 Beiträge seit 2005
vor 17 Jahren

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)?

Icarus666 Themenstarter:in
153 Beiträge seit 2006
vor 17 Jahren
Lösung

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();
  }
}