为什么我的datatable单元格返回空值?

时间:2013-05-17 17:00:42

标签: .net sql vb.net ms-access

我有一个访问数据库和一个存储的查询。这是我的询问......

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传递的完全相同的值时,我得到了正确的值。当我通过代码运行它时,我得到一个空值。这里有什么突出的东西让我失踪吗?

1 个答案:

答案 0 :(得分:2)

我假设您的.Net使用OleDb连接到Access db文件。 OleDb(与Access中的ADO相同)需要不同的外卡字符:%_而不是*?

以这种方式尝试:

WHERE ProjectNum LIKE IIF([@priorityDefID] = 4, "C%", "F%");

注意我从WHERE子句中丢弃了不需要的括号;如果丢弃太多,你可能需要补充一些。

另请考虑您是否认为ALikeLike的合适替代品:

WHERE ProjectNum ALike IIF([@priorityDefID] = 4, "C%", "F%");

使用ALike,无论查询运行的上下文如何,Access数据库引擎始终都要求通配符为%_。 .ADO,DAO,OleDb ......它总会返回相同的结果集。因此,对于ALike,查询在Access会话中的工作方式与使用OleDb从.Net调用时相同。