【发布时间】:2015-04-01 12:11:54
【问题描述】:
我有一个将字段列表插入数据库的程序。当我使用自己的计算机插入日期时间字段时,它看起来完成得很好。但是,当我使用 Windows 7 中文版插入时,该字段变为 0000-00-00 00:00:00 这是命令
MySqlCommand myCommand4 = new MySqlCommand("Insert into OrderRecords_table values('" + OrderIDLabel.Text + "','" + customerCode + "','" + customer + "','" + TelComboBox.Text + "','" + LicenseComboBox.Text + "','" +
DriverComboBox.Text + "','" + AddressComboBox.Text + "','" + LocationTypeComboBox.Text + "','" + PickupComboBox.Text + "','" + CustomerTypeLabel.Text + "','" +
Convert.ToDecimal(TotalPriceLabel.Text) + "','" + status + "','" + note + "','" + sandReceiptNo + "','" + createtiming + "','" + Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")) + "')", myConnection);
myCommand4.ExecuteNonQuery();
我知道它看起来有点乱,但它说的部分
STR_TO_DATE('" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "','%Y/%M/%d /%H/%m/%s'))"
是我插入当前日期时间的部分。当我使用英文版 Windows 时它工作得很好,但每当我使用中文版时,它不是 0000-00-00 00:00:00 而不是实际时间,我试图更改在控制面板中显示日期的格式,但它仍然有同样的问题。
谁知道问题出在哪里?
谢谢
编辑了我的代码
var sql = "insert into OrderRecords_table values(@OrderID, @customercode, @customer, @PhoneNumber, @license, @driver, @address, @type, @pickupLocation, @PaymentMethod, @totalPrice, @status, @notes, @sandreceiptNo,@createTime, @EditTime)";
using (var myCommand4 = new MySqlCommand(sql, myConnection))
{
myCommand4.Parameters.AddWithValue("@orderId", MySqlDbType.VarChar).Value = OrderIDLabel.Text;
myCommand4.Parameters.AddWithValue("@customercode", MySqlDbType.VarChar).Value = customerCode;
myCommand4.Parameters.AddWithValue("@customer",MySqlDbType.VarChar).Value = customer;
myCommand4.Parameters.AddWithValue("@PhoneNumber", MySqlDbType.VarChar).Value =TelComboBox.Text;
myCommand4.Parameters.AddWithValue("@license", MySqlDbType.VarChar).Value = LicenseComboBox.Text;
myCommand4.Parameters.AddWithValue("@driver", MySqlDbType.VarChar).Value = DriverComboBox.Text;
myCommand4.Parameters.AddWithValue("@address", MySqlDbType.VarChar).Value = AddressComboBox.Text;
myCommand4.Parameters.AddWithValue("@Type", MySqlDbType.VarChar).Value = LocationTypeComboBox.Text;
myCommand4.Parameters.AddWithValue("@pickupLocation", MySqlDbType.VarChar).Value = PickupComboBox.Text;
myCommand4.Parameters.AddWithValue("@PaymentMethod", MySqlDbType.VarChar).Value = CustomerTypeLabel.Text;
myCommand4.Parameters.AddWithValue("@totalPrice", MySqlDbType.Decimal).Value = Convert.ToDecimal(TotalPriceLabel.Text);
myCommand4.Parameters.AddWithValue("@status", MySqlDbType.VarChar).Value = status;
myCommand4.Parameters.AddWithValue("@notes", MySqlDbType.VarChar).Value =status;
myCommand4.Parameters.AddWithValue("@sandreceiptNo", MySqlDbType.VarChar).Value = sandReceiptNo;
myCommand4.Parameters.AddWithValue("@createTiming", MySqlDbType.DateTime).Value = createtiming;
myCommand4.Parameters.AddWithValue("@EditTime", MySqlDbType.DateTime).Value = DateTime.Now;
myCommand4.ExecuteNonQuery();
它说我有一些无效的输入,但我检查了几次所有字段都分配给了正确的类型......不知道怎么回事
【问题讨论】:
-
它不仅看起来凌乱,而且还可以进行sql注入。使用 sql 参数。这也解决了这个本地化问题。
-
将您的语句更改为使用@Parameters,那么您将不会遇到不同文化设置的问题,第二个好处是:您不会遇到包含' .. SQL injection ...
-
请不要连接字符串生成SQL语句!使用参数化查询更容易、更快、更安全。您也不必关心转换或文化 - 只需将日期作为日期参数传递,小数作为十进制参数传递。
-
谢谢大家的快速回复,但是我不太明白使用参数的含义,可以给我看一些例子吗?这是我第一次使用mysqlconnection,我最近才开始使用数据库@PanagiotisKanavos
-
谷歌上有关 ADO.NET 和参数化查询的任何教程,例如 Configuring Parameters and Parameter Data Types
标签: c# mysql datetime mysqlconnection