我是c#的新手 我有SQL和DATE的问题 在这个查询中我有错误...
ERROR [22018] [Microsoft] [ODBC dBase 驱动程序]标准中的数据类型不匹配 表达
private void button2_Click(object sender, EventArgs e)
{
char split = '.';
string[] s = dateTimePicker1.Text.Split(split);
string sx = s[0] + "." + s[1] + ".";
System.Data.Odbc.OdbcConnection oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;
SourceDB=C:\sales\;Exclusive=No; Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
oConn.Open();
System.Data.Odbc.OdbcCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT COD,PRICE,SMAN_COD FROM C:\sales\sl.DBF WHERE DATE='"+dateTimePicker1.Text+"'";
DataTable dt = new DataTable();
dt.Load(oCmd.ExecuteReader());
oConn.Close();
dataGridView1.DataSource = dt;
}
请帮帮我
答案 0 :(得分:7)
根本不要在SQL中发送日期/时间值。使用参数化查询 - 这样您就不需要关心格式了。当你可以在不解析和格式化数据的情况下进行数据通信时,为什么会使事情变得复杂并让自己对微妙的问题持开放态度?
此外,如果你习惯使用所有值的参数,你将避免SQL注入攻击。
在这种情况下,您使用DateTimePicker.Value
代替DateTimePicker.Text
来获取DateTime
的值。
答案 1 :(得分:2)
如果您想确保以正确的方式格式化发送到数据库的日期,我建议采用以下日期格式:
yyyy-MM-dd
据我所知,无论您的机器文化和运行数据库服务器的机器如何,这都将起作用。
此格式称为ISO 8601。
答案 2 :(得分:2)
尝试使用Parametrized Queries to Avoid Sql Injection
ooops,OdbcCommand似乎与SqlCommand For Parametriezed Queries不同。
更改
System.Data.Odbc.OdbcCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT COD,PRICE,SMAN_COD FROM C:\sales\sl.DBF WHERE DATE='"+dateTimePicker1.Text+"'";
要
System.Data.Odbc.OdbcCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT COD,PRICE,SMAN_COD FROM C:\sales\sl.DBF WHERE DATE=?";
oCmd.Parameters.Add ("DATE", OdbcType.DateTime).Value = dateTimePicker1.Value;
希望这会对你有帮助!
答案 3 :(得分:1)
我认为问题在于您的输出日期是12/01/2011的格式
如果是的话。你需要把它转换成2010-01-12
DateTimePicker我认为有一个名为SelectedDate而不是Text
的属性如果是这种情况那么
使用:
String.Format("{0:yyyy-MM-dd}", DatePicker1.SelectedDate);
答案 4 :(得分:0)
这种情况正在发生,因为sql期望日期采用某种格式。尝试替换
dateTimePicker1.Text
与
dateTimePicker1.Text.ToString("dd mmm yyyy");
希望这有帮助。