2015-04-01 4 views
0

У меня есть программа, которая вставляет список полей в базу данных. Когда я использую свой собственный компьютер для вставки поля datetime, он выглядит отлично. Однако, когда я вставить его с помощью Windows 7 китайского издания, поле станет 0000-00-00 00:00:00 это командаC# mysqlcommnand вставить в базу данных mysql

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'))" - это та часть, где я вставляю текущее время и дату. он отлично работает, когда я использую английскую версию окон, но всякий раз, когда я использую китайское издание, это isnert 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(); 

его о том, что у меня есть некоторый недопустимый ввод, но я проверил несколько раз, что все поля asigned правильного типа ... не знаю, что происходит

+2

Он не только выглядит грязным, он также открыт для SQL-инъекции. Используйте sql-параметры. Это также устраняет эту проблему локализации в качестве боковой линии. –

+0

Измените ваше заявление на использование @Parameters, тогда у вас не будет проблем с разными настройками культуры, и в качестве второго преимущества: у вас не будет проблем с пользователем. Ввод, содержащий «.. SQL injection ... –

+2

Пожалуйста, не связывайте строки для генерации операторов SQL! Использование параметризованного запроса проще, быстрее и безопаснее. Вы также * не * должны заниматься конверсиями или культурами - просто передавать даты как параметры даты, десятичные числа как десятичные параметры. –

ответ

-1
MySqlCommand Insert = new MySqlCommand("INSERT INTO [TABLE] ([Date], [TEXT]) VALUES(@Date, @Text) ", myConnection); 
Insert.CommandTimeout = 60; //if you need 
Insert.Parameters.AddWithValue("@Date", DateTime.Now); 
Insert.Parameters.AddWithValue("@Text", "Hello word!"); 
Insert.ExecuteNonQuery(); 
Insert.Dispose(); 
+0

Я проигнорировал ваш ответ по следующим причинам: «только для кода» и плохой способ кодирования (используя объект, который наследует от IDisposable без использования конструкции). – Cameron

0

Я переписал ваш код более стандартизованной реализации (с лучшими практиками). Обратите внимание, что я вытащил ваш запрос в отдельную переменную, чтобы код и запрос стали более читабельными.

var sql = "insert into orderrecords_table values " + 
      "(@orderId,       " + 
      " @customercode,      " + 
      " @customer,       " + 
      " @telephone,       " + 
      " @license,       " + 
      " @driver,        " + 
      " @address        " + 
      " @locationType,      " + 
      " @pickup,        " + 
      " @customerType,      " + 
      " @totalPrice,       " + 
      " @status,        " + 
      " @note,        " + 
      " @sandreceiptNo,      " + 
      " @createTiming,      " + 
      " @currentTime)      "; 

using (var myCommand4 = new MySqlComm## Heading ##and(sql, connection)) 
{ 
    myCommand4.Parameters.AddWithValue("@orderId", OrderIDLabel.Text) ; 
    myCommand4.Parameters.AddWithValue("@customercode", customerCode); 
    myCommand4.Parameters.AddWithValue("@customer", customer); 
    myCommand4.Parameters.AddWithValue("@telephone", TelComboBox.Text); 
    myCommand4.Parameters.AddWithValue("@license", LicenseComboBox.Text); 
    myCommand4.Parameters.AddWithValue("@driver", DriverComboBox.Text); 
    myCommand4.Parameters.AddWithValue("@address", AddressComboBox.Text); 
    myCommand4.Parameters.AddWithValue("@locationType", LocationTypeComboBox.Text); 
    myCommand4.Parameters.AddWithValue("@pickup", PickupComboBox.Text); 
    myCommand4.Parameters.AddWithValue("@customerType", CustomerTypeLabel.Text); 
    myCommand4.Parameters.AddWithValue("@totalPrice", Convert.ToDecimal(TotalPriceLabel.Text)); 
    myCommand4.Parameters.AddWithValue("@status", status); 
    myCommand4.Parameters.AddWithValue("@note", status); 
    myCommand4.Parameters.AddWithValue("@sandreceiptNo", sandReceiptNo); 
    myCommand4.Parameters.AddWithValue("@createTiming", createtiming); 
    myCommand4.Parameters.AddWithValue("@currentTime", DateTime.Now); 

    myCommand4.ExecuteNonQuery(); 
} 
+0

для тех? OrderID,? Driver и т. Д., Я полагаю, чтобы поставить «?» там? или вы просто говорите, что вы не уверены в имени столбца? –

+0

Параметры @benjiWong Sql начинаются с токена (обычно '@', но MySQL использует '?'). Поэтому вам нужно включить префикс '?' В начале параметра. Вы должны просмотреть [Команды и параметры MSDN] (https://msdn.microsoft.com/en-us/library/ms254953 (v = vs.110) .aspx). Это очень полезно. Имейте в виду, что большая часть информации тесно связана с Sql Server, но концепции будут одинаковыми для MySQL. – Cameron

+0

Я пробовал код, который вы предоставили, и без «?», Если я делаю это без «?», Он будет запускать код без проблем, но значения в базе данных будут либо нулевыми, либо «», когда я вставляю «? ", я получаю эту ошибку фатальной ошибки, возникающей во время выполнения команды. –