0

私は神がどれくらいの期間知っているかについて、以下のコードを見てきましたが、問題が何であるかを見つけることができないようです. 記載されたエラーに関して私が見たほとんどの議論は、ソースがパラメーターのタイプミスによるものであることを示しています。しかし、なぜ嘘をつくのか、タイプミスは見られません。誰かがどこが間違っているのか教えてもらえますか?

Dim dt As System.Data.DataTable = New System.Data.DataTable
dim sqlText as string
sqlText = "SELECT id AS privilegeID, " & _
"user_id AS userID, " & _
"module_id AS moduleID, " & _
"can_read AS canRead, " & _
"can_create AS canCreate, " & _
"can_update AS canUpdate, " & _
"can_delete AS canDelete, " & _
"is_deleted AS isDeleted, " & _
"is_active AS isActive " & _
"FROM base_user_privilege " & _
"WHERE " & _
"user_id=@userID AND " & _
"is_deleted=@isDeleted AND " & _
"is_active=@isActive"
SetDBCommand(sqlText)
DBCommand.Parameters.AddWithValue("@userID", userID)
DBCommand.Parameters.AddWithValue("@isDeleted", IsDeleted)
DBCommand.Parameters.AddWithValue("@isActive", IsActive)
dt = DBAction(sqlText, DBActionType.DataTable)

setdbcommand (sqltext)は接続を確立するためのものであり、機能するため、他の選択および挿入ステートメントで機能しているため、エラーはないと思います。

手伝ってください。

ありがとう。

編集

setdb コマンドは次のとおりです。

Public Sub SetDBCommand(ByVal sqlString As String)
    If DBConnection.State = ConnectionState.Closed Then
        DBConnection.Open()
    End If
    DBCommand = New SQLiteCommand(sqlString, DBConnection)
End Sub

Reader では機能しますが、データ テーブルでは機能しません

私の dataconnection 関数では、上記のパラメーターはDataReaderを介して渡されると機能しますが、 DataTableを介して渡されると機能しません。パラメータは DataTable で機能しますか?

Public Function DBAction(ByVal sqlText As String, ByVal ActionType As DBActionType) As Object
    DBAction = Nothing
    Select Case ActionType
        Case DBActionType.DataReader
            Return DBCommand.ExecuteReader
        Case DBActionType.Dataset
            Dim MyAdpater As New SQLiteDataAdapter(sqlText, DBConnection)
            Dim myDataSet As New System.Data.DataSet
            MyAdpater.Fill(myDataSet)
            Return myDataSet
        Case DBActionType.DataTable
            Dim MyAdpater As New SQLiteDataAdapter(sqlText, DBConnection)
            Dim MyDataTable As New System.Data.DataTable
            MyAdpater.Fill(MyDataTable)
            Return MyDataTable
        Case DBActionType.executeNonQuery
            DBCommand.ExecuteNonQuery()
        Case DBActionType.ExecuteScalar
            Dim ScalarItem As Object = DBCommand.ExecuteScalar
            Return ScalarItem
        Case Else
            Throw New Exception("Error in DBACTION")
    End Select
End Function
4

2 に答える 2

1

SQLiteDataAdapter を作成するときに、DBCommand をパラメーターとして指定する必要があります。おまけとして、既にコマンドを適切にセットアップしているため、接続パラメーターを指定する必要はありません。

Public Function DBAction(ByVal sqlText As String, ByVal ActionType As DBActionType) As Object
    DBAction = Nothing
    Select Case ActionType
        Case DBActionType.DataReader
            Return DBCommand.ExecuteReader
        Case DBActionType.Dataset
            Dim MyAdpater As New SQLiteDataAdapter(DBCommand)
            Dim myDataSet As New System.Data.DataSet
            MyAdpater.Fill(myDataSet)
            Return myDataSet
        Case DBActionType.DataTable
            Dim MyAdpater As New SQLiteDataAdapter(DBCommand)
            Dim MyDataTable As New System.Data.DataTable
            MyAdpater.Fill(MyDataTable)
            Return MyDataTable
        Case DBActionType.executeNonQuery
            DBCommand.ExecuteNonQuery()
        Case DBActionType.ExecuteScalar
            Dim ScalarItem As Object = DBCommand.ExecuteScalar
            Return ScalarItem
        Case Else
            Throw New Exception("Error in DBACTION")
    End Select
End Function

As an aside, since I didn't see them anywhere in the code you posted, make sure you're properly disposing of the SQLiteCommand and SQLiteDataAdapter objects. The connection should be closed, and then disposed, when finished.

于 2012-09-14T17:03:14.957 に答える
0

問題は、パラメーターを DBCommand に追加していることですが、アダプターが DBCommand を使用しない case ステートメントでは、渡した文字列 (sqlText) のみを取得します。

考えられる解決策の 1 つは、パラメーターとして sqlText を渡す代わりに、コマンド全体を渡して MyAdapter.SelectCommand に割り当てることです。

Function DBAction( inCommand As SQLiteCommand, ActionType As DBActionType)
于 2012-09-14T16:35:44.863 に答える