从c#执行dbf中的查询

时间:2015-12-21 16:22:31

标签: c# foxpro dbf

我正在用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";放得很好。

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

1 个答案:

答案 0 :(得分:6)

此处的问题是OLE DB Provider不支持CTOD()功能。

将您的查询更改为使用DTOS(),其中包含:

  

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

<小时/> 编辑:作为@AlanB评论中的良好建议,您应始终努力使用parametrized queries而不是字符串来阻止SQL Injection攻击。

关于OLEDB参数的评论:

  

OLE DB .NET提供程序不支持传递的命名参数   SQL语句或由a调用的存储过程的参数   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();