我正在使用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';
由于
答案 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。