ACCESS SQL:Nz()函数从VBD执行

时间:2012-04-08 16:12:53

标签: sql vb.net ms-access

  

可能重复:
  Convert Null to zero in access database

我正在使用Microsoft Visual Web Developer 2010 Express创建ASP / VB.NET页面以连接Microsoft Office Access 07.这是我的问题:

我有这个页面有三个下拉列表,用于过滤DataTable,我有这个Access SQL查询在Access中完美运行,但是当我尝试从VB.net执行sql时出错是总是出现。 “未定义的函数'Nz'在表达式中。”

我已经知道可能还有一个错误我找不到解决方案。

VB.NET代码:

Shared Function SelectFilterWomen(ByVal tTypeCode As Integer, ByVal bBrandCode As Integer, ByVal sSize As Integer) As DataTable
    Dim Command As New OleDbCommand()
    Command.CommandText = "QUERY;"
    Command.Connection = DB.Conn()
    Command.Parameters.AddWithValue("@tTypeCode", tTypeCode)
    Command.Parameters.AddWithValue("@bBrandCode", bBrandCode)
    Command.Parameters.AddWithValue("@sSize", sSize)
    Dim Table As New DataTable("FilterWomen Shoes")
    Table.Load(Command.ExecuteReader())
    Return Table

QUERY:

SELECT S.sShoes_ID , S.sPicture, S.sSize , S.sPrice 
FROM ((Shoes S INNER JOIN Type T ON S.tTypeCode = T.tTypeCode)
INNER JOIN Brand B ON S.bBrandCode = B.bBrandCode) 
WHERE S.tTypeCode = Nz(@tTypeCode, T.tTypeCode) 
AND S.bBrandCode = Nz(@bBrandCode, B.bBrandCode) 
AND S.sSize = Nz(@sSize, S.sSize) 
AND S.sSex = 'Female' AND S.sActive = 'Y';

由于

2 个答案:

答案 0 :(得分:2)

如果只有表达式服务可用,则Access查询可以使用VBA函数(和用户定义的函数)。表达式服务只能在Access应用程序实例中使用。

当您使用OleDb从Dot.Net连接到Access数据库文件时,您没有连接到Access应用程序实例(仅限其数据库引擎),因此表达式服务不可用。因此,您不能在查询中使用VBA或用户定义的函数。您仅限于由db引擎实现的那些函数。

因此,无论您尝试什么,任何包含VBA Nz()函数的查询都会触发“ Undefined function'Nz'in expression ”错误。如果没有Expression Service,访问'db引擎不知道Nz()是什么来帮助它。

寻找Nz()的替代方案。在许多情况下,IIf Function可能是一个很好的替代品。

<强>语法
IIf(expr,truepart,falsepart)

在查询中,您可以执行以下操作:

SELECT IIf([SomeField] Is Null, "unavailable", [SomeField])
FROM YourTable;

如果您了解VBA IIf()功能,这可能听起来像是一个矛盾。但是,db引擎包含自己的IIf()实现,其运行方式与VBA IIf()不同。当 truepart 为True时,db引擎的IIf()“短圈”是真的,所以在那种情况下不评估 falsepart ;即使 truepart 为True,VBA IIf()也始终评估 truepart falsepart

答案 1 :(得分:0)

使用isnull代替Nz。 Isnull是SQL标准函数,Nz是Access-only。