2016-04-19 42 views
2

Ich muss eine neue Zeile in einer MySQL-Tabelle mit C# einfügen. Die Tabelle sieht like this aus und enthält eine Fremdschlüsselspalte. Ich benutze den folgenden Code, um mit der Datenbank zu verbinden und Daten einzufügen.C# zu mysql - neue Zeile in Tabelle mit Fremdschlüssel einfügen

public virtual void addToDB() 
    { 
     try 
     { 
      //prepare for query 
      var cmd = MySQL.readyQuery(); 

      //insert testdata to Vo2test 
      cmd.CommandText = "INSERT INTO vo2test_tb(ClientID, Weight, Methods, TimeOfDay, Date, StartResistance, Endresistance, TheoreticalMaxPulse, FatPercent3point, FatPercent7point, VO2_max, FitnessRating, HRmax, RERmax, TestTime, Raw_test_data) VALUES((SELECT UserID from user_tb WHERE UserID = '@UserID'), '@Weight', '@Method', '@Timeofday', '@Date', '@Startresistance', '@Endresistance', '@Theoreticalmaxpulse', '@Fatprocent3p', '@Fatprocent7p', '@vo2max', '@fitnessrating', '@hrmax', '@rermax', '@testtime', '@rawtestdata')"; 

      cmd.Prepare(); 
      //insert parameters som skal ændres: 
      cmd.Parameters.AddWithValue("@UserID", UserID); 
      cmd.Parameters.AddWithValue("@Weight", Weight); 
      cmd.Parameters.AddWithValue("@Method", Method); 
      //coverts date to 0000-00-00 
      string DateString = Convert.ToString(TestDate.Date.Date.Year) + "-" + Convert.ToString(TestDate.Date.Month) + "-" + Convert.ToString(TestDate.Date.Day); 
      cmd.Parameters.AddWithValue("@Date", DateString); 
      //converts time to 00:00:00. 
      string TimeString = Convert.ToString(TimeOfDay.Hour) + ":" + Convert.ToString(TimeOfDay.Minute) + ":00"; 
      cmd.Parameters.AddWithValue("@Timeofday", TimeString); 
      cmd.Parameters.AddWithValue("@Startresisstance", StartResistance); 
      cmd.Parameters.AddWithValue("@Endressistance", EndResistance); 
      cmd.Parameters.AddWithValue("@TheoreticalMaxPulse", TheoreticMaxPulse); 
      cmd.Parameters.AddWithValue("@FatPercent3point", FatPercent3Point); 
      cmd.Parameters.AddWithValue("@FatPercent7point", FatPercent7Point); 
      cmd.Parameters.AddWithValue("@VO2_max", Vo2Max); 
      cmd.Parameters.AddWithValue("@FitnessRating", FitnessRating); 
      cmd.Parameters.AddWithValue("@HRmax", HRmax); 
      cmd.Parameters.AddWithValue("@RERmax", RERmax); 
      cmd.Parameters.AddWithValue("@TestTime", TimeOfDay); 
      cmd.Parameters.AddWithValue("@Raw_test_data", RawTestData); 

      cmd.ExecuteNonQuery(); 

      //close connection 
      cmd.Connection.Close(); 
     } 
     catch (MySqlException ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

, wenn ich es laufen, bin ich gesagt, dass ClientID nicht null sein kann, aber wenn ich die SQL-Abfrage in Adminer nur laufen funktioniert es gut.

+0

Sind Sie sicher, dass Ihre Sub-Auswahl für die ClientID korrekt ist. Es sieht nicht richtig aus, wo Sie die UserID mit dem FIrstName vergleichen und die UserID zurückgeben – CathalMF

+0

Haben Sie versucht, indem Sie das "@" durch "?" ? "@" sind für SQLServer –

+0

@MarrowGnawer Es ist @ in MySQL – CathalMF

Antwort

0

Die Unterauswahl in Ihrer einfügen Abfrage macht keinen Sinn. Warum machst du eine Unterauswahl, um einen Wert einzugeben, den du bereits hast.

SELECT UserID from user_tb WHERE UserID = '@UserID' 

Fügen Sie einfach @UserID direkt ein.

Sie haben auch alle Ihre @ -Parameter in einfache Anführungszeichen in der Abfragezeichenfolge geschrieben. Du brauchst das nicht. Die Parametrisierung behandelt die Angebote für Sie im Hintergrund. Entfernen Sie alle einfachen Anführungszeichen, so dass es gerade liest:

cmd.CommandText = "INSERT INTO vo2test_tb(ClientID, Weight, Methods, TimeOfDay, Date, 
StartResistance, Endresistance, TheoreticalMaxPulse, FatPercent3point, FatPercent7point, 
VO2_max, FitnessRating, HRmax, RERmax, TestTime, Raw_test_data) 

VALUES((SELECT ClientID from user_tb WHERE UserID = @UserID), @Weight, @Method, @Timeofday, 
@Date, @Startresistance, @Endresistance, @Theoreticalmaxpulse, @Fatprocent3p, @Fatprocent7p, 
@vo2max, @fitnessrating, @hrmax, @rermax, @testtime, @rawtestdata)"; 
+0

Entschuldigung, der Vorname = war nur ein Test, ich vergesse zu ändern. Ich änderte ich im Code und es ist jetzt SELECT UserID von user_tb WHERE UserID = '@UserID' Ich habe immer noch das Problem mit dem gleichen Problem. – R0ede

+0

@ R0ede Ihre Bearbeitung gibt immer noch die Benutzer-ID in der Unterabfrage zurück. Sollte es die ClientID nicht zurückgeben. – CathalMF

+0

UserID und ClientiD ist eigentlich das gleiche. Ich habe eine Tabelle namens user_tb mit verschiedenen Arten von Benutzern, von denen einer Client ist. Die Client-ID ist ein Fremdschlüssel aus der Tabelle user_tb, in der sie UserID heißt. – R0ede

Verwandte Themen