我在C#中做一个程序,我试图在DBF文件中执行一个查询,我认为没问题,但DataReader的HasRows属性值为false.我认为问题在于日期.这是我的代码:
string Con = @"Provider=VFPOLEDB.1;Data Source=\\Server\ges_01"; OleDbConnection ConnectionHandler = new OleDbConnection(Con); ConnectionHandler.Open(); string SQL = "SELECT codalb FROM BALBARA WHERE FECALB BETWEEN CTOD('2015/12/07') AND CTOD('2015/12/13') AND CODCLI LIKE '%9' ORDER BY CODALB" OleDbCommand Query = new OleDbCommand(SQL, ConnectionHandler); OleDbDataReader datareader = Query.ExecuteReader(); while(datareader.Read()) {}
我知道其余的都可以,因为如果把string SQL="select codalb from balbara";
工作正常.
任何人都可以说我做错了什么
这里的问题是OLE DB提供程序CTOD()
不支持该功能.
更改您的查询以使用DTOS()
哪个:
从指定的Date或DateTime表达式返回yyyymmdd格式的字符串日期.
因此,总结您的查询可能会变为:
string SQL = String.Format( @"SELECT codalb FROM balbara WHERE DTOS(fecalb) BETWEEN '{0}' AND '{1}' AND codcli LIKE '%9' ORDER BY codalb", dateTimeVariable1.ToString("yyyyMMdd"), dateTimeVariable2.ToString("yyyyMMdd"));
注1:检查缩进以帮助您编写可读代码,我建议将所有列/表名称写成小写,这样您就可以轻松区分什么是"数据"和什么是SQL.
注意2:您可以在此处找到有关此DateTime
类型的正式格式字符串示例.
关于OLEDB参数的评论:
当CommandType设置为Text时,OLE DB .NET提供程序不支持将参数传递给SQL语句或OleDbCommand调用的存储过程的命名参数.在这种情况下,必须使用问号(?)占位符.
关于参数的顺序:
因此,OleDbParameter对象添加到OleDbParameterCollection的顺序必须直接对应于命令文本中参数的问号占位符的位置.
因此,给出查询的所有这些信息都可以看作这样的示例:
OleDbCommand Query = new OleDbCommand(); Query.Connection = ConnectionHandler; Query.CommandText = @"SELECT codalb FROM balbara WHERE DTOS(fecalb) BETWEEN ? AND ? AND codcli LIKE '%9' ORDER BY codalb"; Query.Parameters.Add(dateTimeVariable1.ToString("yyyyMMdd")); Query.Parameters.Add(dateTimeVariable2.ToString("yyyyMMdd")); OleDbDataReader datareader = Query.ExecuteReader();