2

当我将它添加到我的 where 子句时:

DueDate <= getDate() AND DueDate IS NOT null

我得到一个不错的小故障,上面写着:无法创建子:System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.Data.EvaluateException:表达式包含未定义的函数调用 getDate()。

知道我做错了什么吗?


更新 使用中的代码:

private string getFilter(int mode) {
    String filter = "";
    if ((ALL_WORK_ORDERS & mode) == 0) {
        if ((mode & OUTSTANDING_WORK_ORDERS) == OUTSTANDING_WORK_ORDERS) {
            filter += "DueDate <= getDate() AND DueDate IS NOT null OR";
        }
        if ((mode & COMPLETED_WORK_ORDERS) == COMPLETED_WORK_ORDERS) {
            filter += " FinishedDate IS NOT  null";
        }
    }

    filter = filter.Trim();
    if (filter.EndsWith("OR")) {
        filter = filter.Remove(filter.Length - 2);
    }

    return filter;
}

它在这里被使用:

tblWorkOrderBindingSource.Filter = getFilter(mode);

在表中,DueDate 是日期时间类型。

旁注: 我可以跑

SELECT [ID]
      ,[WorkDesc]
      ,[DueDate]
  FROM [RentalEase].[dbo].[tblWorkOrder]
WHERE [DueDate] <= getDate() AND [DueDate] IS NOT null

在 MS SQL Server Management Studio Express 中没有问题。


最终解决方案

    private string getFilter(int mode) {
        String filter = "";
        if ((ALL_WORK_ORDERS & mode) == 0) {
            if ((mode & OUTSTANDING_WORK_ORDERS) == OUTSTANDING_WORK_ORDERS) {
                filter += "DueDate <= #" + DateTime.Now.ToShortDateString() + "# AND DueDate IS NOT null  AND FinishedDate IS null OR";
            }
            if ((mode & COMPLETED_WORK_ORDERS) == COMPLETED_WORK_ORDERS) {
                filter += " FinishedDate IS NOT null";
            }
        }

        filter = filter.Trim();
        if (filter.EndsWith("OR")) {
            filter = filter.Remove(filter.Length - 2);
        }

        return filter;
    }
4

5 回答 5

4

异常很清楚这里出了什么问题。您正在指定一个方法 getdate,它不能在过滤器表达式中使用。请参阅有关 DataColumn 类的 Expression 属性的文档,了解什么是有效的,什么是无效的:

http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx

话虽如此,您需要将日期连接到过滤器中,而不是 getdate(调用 DateTime 结构上的静态 Now 属性以获取当前日期)。上面的链接将向您展示如何正确格式化日期(您不能只按照凯利的回答中的说明进行操作,尽管该答案大部分都是这样)。

于 2009-02-11T21:40:10.873 回答
2

你有没有尝试过

filter += "DueDate <= #" + DateTime.Now + "# AND DueDate is not Null"
于 2009-02-11T21:36:44.267 回答
1

System.Reflection.TargetInvocationException

此消息并非来自 Sql Server。我认为您实际上是在该字符串中编写 C# 并在运行时针对 .net 类型(而不是表定义)对其进行编译/解释。

此外,SQLServer 2005 与 || 存在问题。和 &&...

SELECT CASE WHEN 1=1 && 3=3 THEN 1 ELSE 0 END
--Incorrect syntax near '&'.

SELECT CASE WHEN 1=1 || 3=0 THEN 1 ELSE 0 END
--Incorrect syntax near '|'.
于 2009-02-11T21:21:18.517 回答
0

那应该是T-SQL吗?试试这个

DueDate <= getDate() 
AND  DueDate IS NOT null
于 2009-02-11T21:12:58.367 回答
0

如果这应该是 sql 则"||" 不是"OR"的符号,"&&"不是AND的符号。

filter += "DueDate <= GetDate() AND DueDate is not NULL OR ";
于 2009-02-11T21:18:00.367 回答