Laden...

mySQL Insert mit Stored Procedure und Auto Increment

Erstellt von ek111 vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.614 Views
Thema geschlossen
E
ek111 Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren
mySQL Insert mit Stored Procedure und Auto Increment

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

2.207 Beiträge seit 2011
vor 9 Jahren

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

E
ek111 Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren

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

1.696 Beiträge seit 2006
vor 9 Jahren

Hallo,

name könnte ein reserviertes Wort sein und entferne das Komma dahinter, du hast ja nur ein Parameter.

Grüße

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

E
ek111 Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren

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.

H
523 Beiträge seit 2008
vor 9 Jahren

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?

E
ek111 Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren

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.

1.696 Beiträge seit 2006
vor 9 Jahren

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

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

16.807 Beiträge seit 2008
vor 9 Jahren

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.

E
ek111 Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren

Ich denke es ist egal ob hier '?' oder '@' als Prefix verwendet wird

2.207 Beiträge seit 2011
vor 9 Jahren

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

16.807 Beiträge seit 2008
vor 9 Jahren

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.

H
523 Beiträge seit 2008
vor 9 Jahren

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.

E
ek111 Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren

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

1.696 Beiträge seit 2006
vor 9 Jahren

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!

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

E
ek111 Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren
2.298 Beiträge seit 2010
vor 9 Jahren

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 |

E
ek111 Themenstarter:in
8 Beiträge seit 2014
vor 9 Jahren
2.207 Beiträge seit 2011
vor 9 Jahren

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

Hinweis von Abt vor 9 Jahren

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.

Thema geschlossen