将数据插入数据库时​​出错

时间:2017-05-27 13:03:28

标签: c# mysql

'输入字符串的格式不正确。'

我正在尝试使用c#将数据插入MYSQL数据库,但我收到的错误消息是

输入字符串的格式不正确。到达时会出现此错误(ExecuteNonQuery)。

    public void Register_Cutomer_Orders()
    {
        string ConnStr = ConfigurationManager.ConnectionStrings["ConnSet"].ConnectionString;
        string cmdstr = @"INSERT INTO `shopsorders`
                                        (`order_id`,
                                        `Customers_customer_id`,
                                        `Employees_employee_id`,
                                        `Shops_shop_id`,
                                        `total`,
                                        `date`)
                                 VALUES
                                        (@P_order_id,
                                        @P_Customers_customer_id,
                                        @P_Employees_employee_id,
                                        @P_Shops_shop_id,
                                        @P_total,
                                        @P_date)";
        try
        {
            using (MySqlConnection conn = new MySqlConnection(ConnStr))
            using (MySqlCommand cmd = new MySqlCommand(cmdstr, conn))
            {

                conn.Open();
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = cmdstr;
            foreach (DataGridViewRow item in dGVShop.Rows)
            {
                cmd.Parameters.Clear();

                cmd.Parameters.Add("@P_order_id", MySqlDbType.Int32).Value = null;
                cmd.Parameters.Add("@P_Customers_customer_id", MySqlDbType.Int32).Value = Convert.ToInt32(TB_Shop_ReservNum.Text);
                cmd.Parameters.Add("@P_Employees_employee_id", MySqlDbType.Int32).Value = 1;
                cmd.Parameters.Add("@P_Shops_shop_id", MySqlDbType.Int32).Value = Convert.ToInt32(cbShop_Name.SelectedValue);
                cmd.Parameters.Add("@P_total", MySqlDbType.Double).Value = Convert.ToDouble(tb_Shop_Total.Text);
                cmd.Parameters.Add("@P_date", MySqlDbType.DateTime).Value = "sysdate()";

                cmd.ExecuteNonQuery();

            }
                conn.Close();
            }
    }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

}

2 个答案:

答案 0 :(得分:2)

sysdate()不是可以转换为日期的字符串。如果您要发送当前时间,请使用DateTime.UtcNow

cmd.Parameters.AddWithValue("@P_date", MySqlDbType.DateTime).Value = DateTime.UtcNow;

执行隐式转换时,数据库不会执行字符串标记 - 它只是尝试将其强制转换为所需类型。

另外:@P_Customers_customer_id@P_Shops_shop_id@P_total都是数字,但是给定了文字值,这是一个非常糟糕的主意

答案 1 :(得分:1)

AddWithValue的第二个参数不是参数的类型,而是值。

cmd.Parameters.AddWithValue("@P_Customers_customer_id", TB_Shop_ReservNum.Text);

正如您所看到的,这仍然非常弱,因为您传递一个字符串并且AddWithValue决定查看收到的输入的参数类型。

这篇博客文章解释了AddWithValue的所有弱点 Can we stop using AddWithValue already?

我更喜欢以这种方式使用Add方法

cmd.Parameters.Add("@P_Customers_customer_id", MySqlDbType.Int32).Value = Convert.ToInt32(TB_Shop_ReservNum.Text);

最后,当你传递字符串' sysdate()'它不会在系统日期中解决,而是在文字字符串中解决,显然文本' sysdate()'不是约会。

在这种情况下,您应该使用存储过程在服务器上获取系统日期或传递本地计算机DateTime.Now