我有一个访问数据库和一个存储的查询。这是我的询问......
SELECT MAX(CLNG(RIGHT(ProjectNum, 6))) AS LastDigits
FROM project_master_query
WHERE ((ProjectNum LIKE (IIF([@priorityDefID] = 4, "C*", "F*"))));
当我运行此查询并传入@priorityDefID为例时,我得到一个LastDigits列名和一行包含值1的正确值。这是我的VB代码,称之为......
'Project Class (Without adding unnecessary code)
Public Shared Function GenerateProjectNumber(ByVal priorityDefID As Integer) As String
Dim dt As DataTable = ProjectSQL.GetLastGeneratedNumber(priorityDefID)
Dim lastGeneratedNumber As Integer
If dt.Rows.Count > 0 Then
'Exception Occurs Below: DBNull cannot be cast to other types
lastGeneratedNumber = Convert.ToInt32(dt.Rows(0).Item(0)) ' Or .Item("LastDigits"))
End If
End Function
'ProjectSQL Class
Public Shared Function GetLastGeneratedNumber(ByVal priorityDefID As Integer) As DataTable
Dim parameterList As New List(Of DataParameter)
parameterList.Add(New DataParameter("@priorityDefID", priorityDefID, ParameterDirection.Input, OleDbType.Integer))
Return DAL.GetDataTableUsingReader("GetLastGeneratedNumber", parameterList)
End Function
现在您可以看到,返回了一行但它包含一个空值。当我在Access中运行查询并传入与通过VB传递的完全相同的值时,我得到了正确的值。当我通过代码运行它时,我得到一个空值。这里有什么突出的东西让我失踪吗?
答案 0 :(得分:2)
我假设您的.Net
使用OleDb连接到Access db文件。 OleDb(与Access中的ADO相同)需要不同的外卡字符:%
和_
而不是*
和?
。
以这种方式尝试:
WHERE ProjectNum LIKE IIF([@priorityDefID] = 4, "C%", "F%");
注意我从WHERE
子句中丢弃了不需要的括号;如果丢弃太多,你可能需要补充一些。
另请考虑您是否认为ALike
是Like
的合适替代品:
WHERE ProjectNum ALike IIF([@priorityDefID] = 4, "C%", "F%");
使用ALike
,无论查询运行的上下文如何,Access数据库引擎始终都要求通配符为%
和_
。 .ADO,DAO,OleDb ......它总会返回相同的结果集。因此,对于ALike
,查询在Access会话中的工作方式与使用OleDb从.Net
调用时相同。