Hallo Leute!
Ich verzweifle schon langsam. Ich muss ein C# Programm von MS SQL auf mySQL umstellen und hänge nun schon seit einigen Tagen an einem Problem fest.
Es geht um ein Insert mittels MySqlDataAdapter.
Zuerst definiere ich für meinen Adapter die Stored Procedure mit den Parametern wobei einer davon ein Outputparameter sein sollte damit ich die ID vom eingefügten Datensatz retourbekomme (In der DB ist diese Spalter AI).
MySqlCommand oCmdInsert = new MySqlCommand("sp_add_something",
this.oDbCon);
oCmdInsert.CommandType = CommandType.StoredProcedure;
oCmdInsert.Parameters.Add(new MySqlParameter("id", MySqlDbType.Int24, 4, ParameterDirection.Output, false, 0, 0, "id", DataRowVersion.Current, null));
oCmdInsert.Parameters.Add(new MySqlParameter("name", MySqlDbType.Text, 10, "name"));
this.oDataAdapter.InsertCommand = oCmdInsert;
this.oDataAdapter.FillSchema(this.oDataSet, SchemaType.Source, "something");
Aufrufen tu ich das ganze mit
this.oDataAdapter.Update(this.oDataSet, "something");
Die Procedure:
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_add_something`(
OUT id INTEGER,
IN name varchar(10)
)
main: begin
INSERT INTO something
(
name,
)
VALUES
(
name,
);
SET id = LAST_INSERT_ID();
end
Rufe ich den Code auf wird folgender Fehler geworfen:
Fehlermeldung:
--> 10: System.InvalidOperationException: DataColumn '@_cnet_param_id' in der DataTable 'something' für SourceColumn '@_cnet_param_id' ist nicht vorhanden.
bei System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
bei System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
bei MySql.Data.MySqlClient.MySqlDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
bei System.Data.Common.DbDataAdapter.Update(DataSet dataSet, String srcTable)
Keine Ahnung von wo das "@_cnet_param" daherkommt.
Es will einfach nicht funktionieren. Ich habe schon ewig lange gesucht wie man das am besten macht damit ich die ID vom eingefügten Datensatz retourbekomme, aber es klappt einfach nicht. Kann mir da jemand helfen?
Beste Grüße
verwendetes Datenbanksystem: MySQL
Hallo KlemensEngel,
gib doch die LAST_INSERT_ID() einfach mit einem Select zurück? Bin nicht sicher, ob das in StoredProcedures funktioniert, aber meine sowas mal gesehen zu haben.
Edit:
probier auch mal:
CREATE ... PROCEDURE `sp_add_something`(OUT id INT, IN name VARCHAR(10))
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Danke Coffeebean für die rasche Antwort,
also das INT und INTEGER einen Unterschied machen sollte nicht sein, sind ja Synonyme.
Das andere muss ich noch ausprobieren, schauen wir mal 😉
LG
Hallo,
name könnte ein reserviertes Wort sein und entferne das Komma dahinter, du hast ja nur ein Parameter.
Grüße
**:::
Der Code soll nur ein Beispiel sein wie mein Aufbau ist - in Wirklichkeit sieht es etwas anders und komplexer aus. Aber es funktioniert der Beispielcode bei mir auch nicht - aus scheinbar dem gleichen Grund.
Bei mySQL muss man die Namen der Parameter die man übergibt doch mit einem Zeichen (? oder @ soweit ich mich erinnere) als Präfix versehen. Hast Du das mal probiert?
http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqlparameter.html
Funktioniert die Prozedur, wenn Du sie (z. B. mittels HeidiSQL) außerhalb von .NET ausführst?
Also die Procedure funktioniert! Hab ich gestestet.
Das mit den ? hab ich jetzt hinzugefügt, danke für den Hinweis. Hat aber am Fehler leider nichts geändert.
Der Code soll nur ein Beispiel sein wie mein Aufbau ist - in Wirklichkeit sieht es etwas anders und komplexer aus. Aber es funktioniert der Beispielcode bei mir auch nicht - aus scheinbar dem gleichen Grund.
Wenn das nicht der Real-Code ist, wie soll man dir denn helfen?
Grüße
**:::
Das mit den ? hab ich jetzt hinzugefügt, danke für den Hinweis. Hat aber am Fehler leider nichts geändert.
Wozu hat er Dir den Link den gegeben?
Lies ihn halt mal. Dann wirst Du sehen, dass das Parametervorzeichen nicht ? sondern @ ist.
Er war sich ja nicht sicher; ? ist bei einem anderen DBMS notwendig, @ eben bei mySQL - so wie's auch in der verlinkten Doku steht.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich denke es ist egal ob hier '?' oder '@' als Prefix verwendet wird
Ich denke es ist egal ob hier '?' oder '@' als Prefix verwendet wird
Was heisst das? Hast du es ausprobiert und es ist definitiv egal? Oder hat du es noch nicht ausprobiert? ( [Hinweis] Wie poste ich richtig? Punkt 8.) Wenn es so in der Doku steht, wäre es mMn eine weitere Fehlerquelle, die man umschiffen würde.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Ich denke es ist egal ob hier '?' oder '@' als Prefix verwendet wird
Nö. Wie es in der Doku steht: es kommt auf die mysql Version an, ob nur @ geht oder beides.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Du könntest mal folgendes probieren:
1.) Die Procedure einfach mal mittels ExecuteNonQuery("Call namederprocedure(...)") aufrufen und schauen ob es funktioniert.
2.) Diese Funktion für den Aufruf mal probieren: How to call a mySQL stored function in C#?
3.) Wenn gar nicht's hilft dann das Insert sowie das Selektieren der LAST_INSERT_ID aus der Prozedur entfernen und einzeln absetzen.
Danke hypersurf für deine Hilfe, ich hab jetzt mal ein Work-around gemacht in dem ich ein Columnmapping gemacht habe auf den tatsächlichen Columnname im Tableadapter. Jetzt funktionierts mal. Warum dieses 'cnet_param' dazugehängt wird weiß ich aber noch immer nicht.
ITableMapping mapping = oDataAdapter.TableMappings.Add("something","something");
mapping.ColumnMappings.Add("@_cnet_param_id", "id");
this.oDataAdapter.FillSchema(this.oDataSet, SchemaType.Source, "something");
Und ja, bei meiner mysql version ist es egal ob '?' oder '@'.
Ich bin raus
Warum dieses 'cnet_param' dazugehängt wird weiß ich aber noch immer nicht.
Weil du uns deinen echten SP vorenthälst, kann dir auch keiner von uns sagen, warum das so ist!
**:::
Nur so eine kleine Anmerkung nebenbei: Schon die Beispielprozedur ist quatsch. Es wird ein Insert in eine Tabelle versucht. Der Name der Spalte in die eingetragen werden soll, trägt den Wert des Inputparameters. - Eingetragen werden soll dann auch der Wert des Inputparameters.
Komisch, das das noch keiner bemängelt hat.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Anstatt mir bei der Suche des Fehlers zu helfen wird hier auf irgendwelche Sachen aufmerksam gemacht was keinem was bringt.
Entschuldige bitte, aber die Leute versuchen dir hier zu helfen. Und das freiwillig. Alle Helfer haben nur beschrieben, was sie sehen und versucht dir Hilfestellung zu geben. Und du beschwerst dich darüber. Du bist eigentlich einen Dank schuldig. Ich hätte dir das per PM geschrieben, die sind aber deaktiviert. Somit soll es damit bitte gut sein.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Da der Thread-Ersteller anfängt eigene Beiträge zu löschen, schließe ich den Thread hiermit.
Wenn er wieder geöffnet werden sollte bitte PM ans Team.