从c#在dbf中执行查询

本文关键字:执行 查询 dbf | 更新日期: 2023-09-27 18:27:33

我正在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";效果很好。

任何人都可以告诉我我做错了什么

从c#在dbf中执行查询

这里的问题是OLE DB提供程序不支持CTOD()函数。

将您的查询更改为使用DTOS(),即:

从指定的Date或DateTime表达式。

因此,您的查询可能会变成:

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类型的正式格式字符串示例。


编辑:作为@AlanB评论中的一个好的建议,您应该始终努力使用参数化查询而不是字符串来防止SQL注入攻击。

关于OLEDB参数的备注:

OLE DB.NET提供程序不支持用于传递的命名参数SQL语句或由调用的存储过程的参数当CommandType设置为Text时使用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();