2016-02-29 63 views
-1

我遇到了输入datetime.now.toshortstring()的问题,其中mysql使用数据yyyy-MM-dd的语法,并且使用dd-mm-yyyy,并且它导致一个名为“”的错误在MySql.Data.dll 中发生了类型为'MySql.Data.MySqlClient.MySqlException'的未处理异常其他信息:第1行的列'DATA'的日期值不正确:'29 -02-2016'由错误的日期格式导致的sql错误

下面是代码:

  DialogResult dr = MessageBox.Show("Deseja mesmo gravar estas alterações?", "Confirmação", MessageBoxButtons.YesNo, 
       MessageBoxIcon.Information); 

      if (dr == DialogResult.Yes) 
      { 
       string con = "server=localhost;userid=root;password=12345;persistsecurityinfo=True;database=portaria"; 
       string query = "Insert into entradas(id_veiculo,empresa_visitante,empresa_visitar,nome_condutor,visitado,ncartao,data,hora,obs) values('"+ msktxtmat.Text +"','"+ txtempvis.Text +"','"+ comboBox1.SelectedValue +"', '"+ txtnomecondutor.Text +"','"+ txtpessoavisitar.Text +"', '"+ txtncartao.Text +"', '"+ DateTime.Now.ToShortDateString() +"', '"+ DateTime.Now.ToShortTimeString() +"','"+ txtobs.Text +"');"; 
       MySqlConnection Con = new MySqlConnection(con); 
       MySqlCommand Command = new MySqlCommand(query, Con); 
       MySqlDataAdapter sda = new MySqlDataAdapter(); 
       DataTable dt = new DataTable(); 
       sda.SelectCommand = Command; 
       sda.Fill(dt); 
      } 

是啊,我知道,我应该使用参数化querys但actualy我不想浪费时间用参数化重建这段代码,我只是坚持使用常规的形式。

在此先感谢

+2

使用参数,这将解决您的格式问题,它也将为您节省SQL注入。 – Habib

+2

'我知道我应该使用参数化查询,但实际上我不想浪费时间'所以相反,你正在浪费你的时间与字符串日期,格式化问题,类型转换和那个可怕的SQL字符串摔跤。 – Plutonix

+0

我知道它,但由于这是一个垃圾的事情只是为了测试这种方法,我不会botter做任何参数:p这只是教育建议,向我的朋友们展示语言,这将是更多的他们很容易理解这种方法。而且我总是在我的项目中使用参数,但不会在我不会发布的项目上提前感谢! –

回答

1

更换

DateTime.Now.ToShortTimeString() 

DateTime.Now.ToString("yyyy-MM-dd") 

因为MySQL需要一个yyyy-MM-dd日期格式来识别字符串作为

你提到一个有效的日期不想使用参数 - 考虑使用MySqlHelper.EscapeString(TextBox.Text) - 这是避免注入攻击的另一种方法

+0

正如我所说我不会在这个简单的项目中使用参数,我只是学习如何使用日期时间礼节;)我试过它没有成功,什么可能导致这个问题?错误代码:“**没有重载方法'ToShortDateString'需要1个参数**” –

+0

PS:忘记它!!!是的,它工作得很好,我笨到不会复制和粘贴它ahahah,我使用ToShortDateString而不是ToString;)提前致谢! –

5

尝试使用参数化查询!为什么?因为没有你很容易受到SQL注入。看看here。 做这样的事情:

DialogResult dr = MessageBox.Show("Deseja mesmo gravar estas alterações?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Information); 

    if (dr == DialogResult.Yes) 
    { 
     string con = "server=localhost;userid=root;password=12345;persistsecurityinfo=True;database=portaria"; 
     string query = "Insert into entradas(id_veiculo,empresa_visitante,empresa_visitar,nome_condutor,visitado,ncartao,data,hora,obs) values(@msktxtmat, @txtempvis, @comboBox1, @txtnomecondutor, @txtpessoavisitar, @txtncartao, @dateTimeFirst, @dateTimeSeconds, @txtobs);"; 
     MySqlConnection Con = new MySqlConnection(con); 
     MySqlCommand Command = new MySqlCommand(query, Con); 
     Command.Parameters.AddWithValue("@msktxtmat", msktxtmat.Text); 
     Command.Parameters.AddWithValue("@txtempvis", txtempvis.Text); 
     Command.Parameters.AddWithValue("@comboBox1", comboBox1.SelectedValue); 
     Command.Parameters.AddWithValue("@txtnomecondutor", txtnomecondutor.Text); 
     Command.Parameters.AddWithValue("@txtpessoavisitar", txtpessoavisitar.Text); 
     Command.Parameters.AddWithValue("@txtncartao", txtncartao.Text); 
     Command.Parameters.AddWithValue("@dateTimeFirst", DateTime.Now.Date); 
     Command.Parameters.AddWithValue("@dateTimeSeconds", DateTime.Now.Date); 
     Command.Parameters.AddWithValue("@txtobs", txtobs.Text); 
     MySqlDataAdapter sda = new MySqlDataAdapter(); 
     DataTable dt = new DataTable(); 
     sda.SelectCommand = Command; 
     sda.Fill(dt); 
    } 
3

价值29-02-2016真的不是从数据库的视图有效日期时间值。您可能想要使用2016-02-29甚至更​​好,请使用参数化查询。

是的我知道我应该使用参数化querys但实际上我不想浪费时间重建这个代码与参数化,我会坚持使用常规形式在这里。

使用参数化查询将不仅保护您免受SQL注入 - 这也将确保你通过在数据转换为正确的格式。

因此,使用参数化查询,您不仅不必担心问题(例如:如何正确格式化日期?),但作为额外的好处,它使您的应用程序更安全。

有实在没有理由使用参数化查询 ...

常规形式

什么是正的形式?我认为参数化查询是常规的形式。

+0

我说的规则形式是更合乎逻辑的事情,所以新手可以理解命令在做什么。在我开始参数化之前,我使用这种简单的mysql命令来学习,这就是我的目标,即教我的朋友这个简单的步骤,但同时建议他们使用参数来避免注射,就是这样! :) –