'输入字符串的格式不正确。'
我正在尝试使用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);
}
}
答案 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