2016-04-19 9 views
2

C#を使用してmysqlテーブルに新しい行を挿入する必要があります。 テーブルはlike thisとなり、1つの外部キー列を含みます。 私は以下のコードを使用してデータベースに接続し、データを挿入します。C#to mysql - 外部キーを使用して新しい行をテーブルに挿入する

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

私はそれを実行したとき、私はクライアントIDがnullにすることはできませんと言われていますが、私はちょうどAdminerでSQLクエリを実行する場合、それが正常に動作します。

+0

ClientIDのサブ選択が正しいことを確認してください。それはあなたがFIrstNameに対してUserIDを比較し、UserIDを返すところで正しいとは思わない – CathalMF

+0

"@"を "?"に置き換えてみましたか? ? "@"はSQLServer用です –

+0

@MarrowGnawer MySQLで@です – CathalMF

答えて

0

挿入クエリのサブ選択が意味をなさない。なぜあなたはすでに持っている値を挿入するためにサブ選択をしていますか?

SELECT UserID from user_tb WHERE UserID = '@UserID' 

@UserIDを直接挿入するだけです。

また、すべての@パラメータをクエリ文字列の一重引用符で囲みました。あなたはこれを必要としません。パラメータ化は、バックグラウンドでの引用符を扱います。すべての一重引用符を削除してください。

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

申し訳ありませんが、ファーストネーム=ただのテストだったので、私は変更するのを忘れます。 コード内でiを変更しました。現在は user_tbからSELECT UserID WHERE UserID = '@UserID' 私はまだsamemの問題を抱えています。 – R0ede

+0

@ R0edeあなたの編集は依然としてサブクエリのUserIDを返しています。それはClientIDを返すべきではありません。 – CathalMF

+0

UserIDとClientiDは実際には同じです。私はuser_tbというテーブルを持っています。テーブルにはさまざまな種類のユーザーがあり、そのうちの1つはクライアントです。 clientIDは、userIDと呼ばれるuser_tbテーブルの外部キーです。 – R0ede

関連する問題