错误的日期格式导致的SQL错误

时间:2016-02-29 13:52:22

标签: c# mysql date

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

以下是代码:

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

是的,我知道我应该使用参数化查询但实际上我不想浪费时间用参数化重建这段代码,我只会坚持使用常规表格。

提前致谢

3 个答案:

答案 0 :(得分:5)

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

body {font: 12px/15px normal verdana, arial; margin: 2em;}
input {width: 3em; margin-bottom: 0.3em;}
#grades {float:left; margin-right: 3em;}
#meanGrade, #totalECTS, #weightedMean {font-weight: bold; color: green}
#weightedMean {display: inline-block; border-top: 1px dotted #777; margin-top: 0.5em;);

答案 1 :(得分:3)

python2实际上不是数据库视图中的有效日期时间值。您可能希望使用29-02-2016甚至更好,使用参数化查询。

  

是的,我知道我应该使用参数化查询但实际上我不想浪费时间用参数化重建这段代码,我只会坚持使用常规表格。

使用参数化查询不仅可以保护您免受SQL注入的攻击 - 它还可以确保您传入的数据转换为正确的格式。

因此,使用参数化查询不仅可以减少后顾之忧(例如:如何正确格式化日期?),但作为额外的奖励,它可以使您的应用程序更加安全。

使用参数化查询真的没有理由......

  

常规表格

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

答案 2 :(得分:1)

替换

DateTime.Now.ToShortTimeString()

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

因为mySQL需要yyyy-MM-dd日期格式才能将字符串识别为有效日期

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