繁体   English   中英

C#到mysql-使用外键将新行插入表

[英]C# to mysql - inserting new row to table with foreign key

我需要使用C#在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);
        }
    }

当我运行它时,会告诉我ClientID不能为null,但是如果我只是在Adminer中运行sql查询,则效果很好。

您的插入查询中的sub select没有意义。 为什么要进行子选择以插入您已经拥有的值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM