2

可能重复:
在访问数据库中将 Null 转换为零

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

我有这个带有三个下拉列表的页面,用于过滤 DataTable,我有这个 Access SQL Query 在 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

询问:

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';

谢谢

4

2 回答 2

2

当且仅当表达式服务可用时,Access 查询才能使用 VBA 函数(和用户定义的函数) 。表达式服务只能在 Access 应用程序实例中使用。

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

因此,无论您尝试什么,任何包含 VBANz()函数的查询都会触发“ Undefined function 'Nz' in expression ”错误。Access 的数据库引擎不知道Nz()没有表达式服务的帮助。

寻找Nz(). 在许多情况下,IIf 函数可以是一个很好的替代品。

语法
IIf(expr, truepart, falsepart)

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

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

如果您知道 VBAIIf()功能,这听起来可能很矛盾。但是, db 引擎包含其自己的实现,IIf()其运行方式与 VBA 不同IIf()当truepart为 True 时,数据库引擎的IIf()“短路”因此在这种情况下不会评估falsepart;即使truepart为 True , VBA也总是计算truepartfalsepart 。IIf()

于 2012-04-09T19:09:30.793 回答
0

使用isnull而不是Nz. Isnull 是 SQL 标准函数,Nz是 Access-only。

于 2012-04-08T17:13:25.180 回答