2

Access データベースとストアド クエリがあります。これが私のクエリです...

SELECT MAX(CLNG(RIGHT(ProjectNum, 6))) AS LastDigits
FROM project_master_query
WHERE ((ProjectNum LIKE (IIF([@priorityDefID] = 4, "C*", "F*"))));

たとえば、このクエリを実行して @priorityDefID に 2 を渡すと、LastDigits の列名と正しい値 1 を含む 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

ご覧のとおり、行が返されますが、NULL 値が含まれています。Access でクエリを実行し、VB を介して渡すのとまったく同じ値を渡すと、正しい値が得られます。コードで実行すると、null 値が返されます。私が欠けていることを際立たせるものはここにありますか?

4

1 に答える 1

2

.NetAccess dbファイルに接続するためにOleDbを使用していると思います。OleDb (Access の ADO と同じ) では、異なるワイルド カード文字が必要です: %and_の代わりに*and?です。

このようにしてみてください:

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

WHERE節から不要な括弧を削除したことに注意してください。破棄したものが多すぎる場合は、元に戻す必要があるかもしれません。

ALikeまた、次の適切な代替手段があるかどうかも検討してLikeください。

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

ではALike、Access db エンジンは常にワイルド カードを想定し、クエリが実行されるコンテキスト%_関係なく、ADO、DAO、OleDb など、常に同じ結果セットを返します。そのため、クエリは、 OleDbALikeを使用して呼び出された場合と同じように、Access セッションで機能します。.Net

于 2013-05-17T17:12:40.223 に答える