【问题标题】:c# net connector insert into mysql system datetime errorc#net连接器插入mysql系统日期时间错误
【发布时间】:2012-12-07 13:30:18
【问题描述】:

我正在使用 mysql 网络连接器,我想插入一些数据,没有日期时间它可以工作,但是 随着日期时间它给出错误。 我的代码是;

da.InsertCommand = new MySqlCommand("INSERT INTO orders( VALUES('',@ORDER_DATE, @DATE_SHIPMENT, @PRODUCT_ID, @QUANTITY, @CUSTOMER_ID, @INVOICE_FEE, @PROD_TYPE, @BRAND, @MODEL, @PRICE, @VAT)", cs);
da.InsertCommand.Parameters.Add("ORDER_DATE", MySqlDbType.DateTime).Value = oRDER_DATEDateTimePicker.Text;
da.InsertCommand.Parameters.Add("DATE_SHIPMENT", MySqlDbType.DateTime).Value = dATE_SHIPMENTDateTimePicker.Text;
da.InsertCommand.Parameters.Add("PRODUCT_ID", MySqlDbType.Int32).Value = pRODUCT_IDTextBox.Text;
da.InsertCommand.Parameters.Add("QUANTITY", MySqlDbType.Decimal).Value = qUANTITYTextBox.Text;
da.InsertCommand.Parameters.Add("CUSTOMER_ID", MySqlDbType.Int32).Value = textiD.Text;
da.InsertCommand.Parameters.Add("INVOICE_FEE", MySqlDbType.VarChar).Value = comboBoxfee.Text;
da.InsertCommand.Parameters.Add("PROD_TYPE", MySqlDbType.VarChar).Value = pROD_TYPETextBox.Text;
da.InsertCommand.Parameters.Add("BRAND", MySqlDbType.VarChar).Value = bRANDTextBox.Text;
da.InsertCommand.Parameters.Add("MODEL", MySqlDbType.VarChar).Value = mODELTextBox.Text;
da.InsertCommand.Parameters.Add("PRICE", MySqlDbType.Decimal).Value = pRICETextBox.Text;
da.InsertCommand.Parameters.Add("VAT", MySqlDbType.Decimal).Value = vATTextBox.Text;


cs.Open();
da.InsertCommand.ExecuteNonQuery();
cs.Close();

错误是: 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 'VALUES('','0007-12-2012 00:00:00', '0007-12-2012 00:00:00 附近使用的正确语法

我猜我的日期时间格式无法被 mysql 识别,在我的 winform 中 oRDER_DATEDateTimePicker.Text 和 dATE_SHIPMENTDateTimePicker.Text 是短日期时间。

谢谢

【问题讨论】:

    标签: c# mysql datetime


    【解决方案1】:

    不要添加(作为更广泛问题的单个示例)dATE_SHIPMENTDateTimePicker.Text,而是使用DateTime.Parse(等)将实际值作为DateTime,并添加:

    var when = DateTime.Parse(dATE_SHIPMENTDateTimePicker.Text);
    da.InsertCommand.Parameters.Add(
       "DATE_SHIPMENT", MySqlDbType.DateTime).Value = when;
    

    这同样适用于所有参数;整数、日期、小数等。事实上,在同一个方法中简单地使用数据库代码(命令等)和 UI 代码(文本框)告诉我有些事情是非常错误的:理想情况下,你可以通过某个地方的方法来获得它类型化参数:

    void CreateOrder(int foo, string bar, DateTime baz, decimal blop, ...)
    {
       ...
    }
    

    UI 的工作是将人工输入转化为对其他层有意义的实际值,例如您的数据访问代码。

    这样做正确,UI 将处理解析,然后调用一个对 UI一无所知的单独方法与数据库对话。

    另一种方法是让 UI 构建具有类型成员的对象并将其传递:

    void CreateOrder(Order order)
    {
        ...
    }
    

    然后 UI 会:

    var order = new Order();
    order.Id = /* todo... */
    /* ...for each property... */
    CreateOrder(order);
    

    【讨论】:

      【解决方案2】:

      MySqlDbType.DateTime 想要 DateTime 作为参数,而不是 string

      使用DateTime.Parse(oRDER_DATEDateTimePicker.Text)DateTime.ParseExact(oRDER_DATEDateTimePicker.Text, format),其中格式是您选择的日期的自定义格式。它可以是"yyyy-DD-MM" 或任何您想要或需要的。

      【讨论】:

        【解决方案3】:

        您的查询中似乎有一些拼写错误:

        da.InsertCommand = new MySqlCommand("INSERT INTO orders( VALUES('',@ORDER_DATE, @DATE_SHIPMENT, @PRODUCT_ID, @QUANTITY, @CUSTOMER_ID, @INVOICE_FEE, @PROD_TYPE, @BRAND, @MODEL, @PRICE, @VAT)", cs);
                                                              ^^^     ^^
        

        VALUES(之间加一个空格,并去掉orders后面的括号:

        da.InsertCommand = new MySqlCommand("INSERT INTO orders VALUES ('',@ORDER_DATE, @DATE_SHIPMENT, @PRODUCT_ID, @QUANTITY, @CUSTOMER_ID, @INVOICE_FEE, @PROD_TYPE, @BRAND, @MODEL, @PRICE, @VAT)", cs);
        

        其次,(正如其他人所提到的),您没有使用正确的 DateTime 格式。 MySQL 将接受DateTime.Parse 作为输入,但它也应该接受这种格式的字符串:

        yyyy-MM-dd HH:mm:ss
        

        【讨论】:

          猜你喜欢
          • 2016-01-27
          • 1970-01-01
          • 1970-01-01
          • 2013-07-26
          • 1970-01-01
          • 1970-01-01
          • 2012-08-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多