2017-05-27 30 views
1

'入力文字列が正しい形式ではありませんでした。'データをデータバンクに挿入中にエラーが発生しました

私は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); 
     } 

}

+1

指定されたDate-パラメータ – Turo

+0

のための本当の日付を試してみてください、その後置きますそれはSELECTの中にあり、パラメータを使うのは面倒ではありません。 – Crowcoder

答えて

2

sysdate()が日付に変換できる文字列ではありませんDateTime.Nowこの場合

あなたは、サーバー上のシステム日付を取得したり、ローカルコンピュータを渡すために、ストアドプロシージャを使用しshoul。あなたは現在の時刻を送信することを意味する場合は、DateTime.UtcNowを使用します。

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

暗黙の型変換を実行し、データベースが文字列トークンを実行しません - それは単に必要な型にキャストしようとします。また

@P_Customers_customer_id@P_Shops_shop_id@P_totalはすべての数値ですが、あなたは常にdate` `でSYSDATEをしたい場合は非常に悪い考えであるテキスト値、

1

AddWithValueの第2のパラメータは、パラメータが、値のタイプではありません。

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

あなたが見ることができるようにあなたが文字列を渡すとAddWithValueは、受信した入力を見て、パラメータの種類を決定するので、これは、まだ非常に弱いです。

このブログの記事は、それが意志「)(SYSDATE」あなたは文字列を渡すときに私は、

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

最後に、このようにAddメソッドを使用することを好むCan we stop using AddWithValue already?

AddWithValue のすべての弱点を説明しますシステム日付ではなくリテラル文字列で解決され、明らかに 'sysdate()'というテキストは日付ではありません。

関連する問題