0

私のデータベース アクセス メソッドはクラス ファイルにあります。このファイルには別のプロジェクト名があります: Usr_mysqladapter. 別の Web サイト プロジェクトでは、クラス ファイルを dll としてインポートし、オブジェクトを作成してクラス ファイル内の関数を呼び出します。

クラス ファイルには、次の関数が含まれています。

Public Function readfunctioid(ByVal query As String) As DataTable
    Try
        connecttodb()
        mysqlcmd = New MySqlCommand(query, con)
        da = New MySqlDataAdapter(mysqlcmd)
        dt = New DataTable
        da.Fill(dt)
    Catch ex As Exception
        Throw ex
    Finally
        disconnect()
    End Try
    Return dt
End Function

Web サイト プロジェクトは、次のように dll をインポートします。

  Imports Usr_mysqladapter

  Dim obj As Usr_mysqladapter.Class1 = New Usr_mysqladapter.Class1

ボタンをクリックすると、次のような関数が呼び出されます。

dt = obj.readfunctioid("select fld_functionid  from tbl_users_function_permission")

残念ながら、エラーが発生しています。Web サイト プロジェクトからクラス ファイル内の関数にアクセスするにはどうすればよいですか?

4

2 に答える 2

1

質問へのコメントでこれを開始しましたが、大幅に改善されたデータ アクセス クラスの開始点をお見せしましょう。

Public Class SqlDataHelper

    Private Property ConnectionString() As String
         Get
            'return the connection string, perhaps read/cached from a config file
            'I'll often require this as an argument to the class constructor as well
         End Get
         'May not need a setter, depending on how you build this
    End Property

    Private Function GetConnection() As SqlConnection
         GetConnection = New SqlConnection(ConnectionString)
         GetConnection.Open()
    End Function

    Private Function GetDataTable(ByVal query As String, ByVal ParamArray args() As SqlParameter) As DataTable
       Dim ds As New DataTable
       Dim cmd As New SqlCommand(query, GetConnection())     
       If args IsNot Nothing Then
           For Each p As SqlParameter In args
               cmd.Parameters.Add(p)
           Next p
       End If

       Dim da As New SqlDataAdapter(cmd)
       da.Fill(dt)
       Return dt

    End Function

    Private Function UpdateData(ByVal command As String, ByVal ParamArray args() As SqlParameter) As Integer
       Using cn As SqlConnection = GetConnection(), _
             cmd As New SqlCommand(command, cn) 

           If args IsNot Nothing Then
               For Each p As SqlParameter In args
                   cmd.Parameters.Add(p)
               Next p
           End If

           Return cmd.ExecuteNonQuery()
    End Function

    Private Function GetSingleValue(ByVal query As String, ByVal ParamArray args() As SqlParameter) As Object
       Using cn As SqlConnection = GetConnection(), _
             cmd As New SqlCommand(query, cn) 

           If args IsNot Nothing Then
               For Each p As SqlParameter In args
                   cmd.Parameters.Add(p)
               Next p
           End If

           Return cmd.ExecuteScalar()
    End Function

    Public Function ReadFunctionID() As DataTable  
        Return GetDataTable("SELECT fld_functionid FROM tbl_users_function_permission", Nothing)
    End Function

    Public Function ReadFunctionIDByUser(ByVal UserID As Integer) As DataTable
         Return GetDataTable("SELECT fld_functionid FROM tbl_users_function_permission WHERE UserID = @UserID", _
                    New SqlParameter("@UserID", UserID))
    End Function
End Class

このコードの改善点のいくつかを詳しく見てみましょう。まず、パブリックとプライベートの違いに注意してください。プレゼンテーション層からアドホック SQL 文字列を受け入れたいと思うことは決してありません。これは、アドホック SQL を使用できないという意味ではなく、データ セクションとプレゼンテーション セクションを分けておきたいということです。

クラスの最後の 2 つの関数がパラメーター データを処理する方法を見てみましょう。Nothingパラメータを使用しない場合は明示的に使用する必要があるという事実は、このコードの特徴です。クエリ パラメーターを使用する必要があることを常に思い出させてくれます。SQL インジェクションとは何か、またそれを防ぐ方法がわからない場合は、データベース コードを書くべきではありません。

これがお役に立てば幸いです。

于 2013-01-18T19:44:31.340 に答える
0

あなたのウェブサイトプロジェクトでは、単に次のようにします.....

Dim MyCustomSqlAdapter As = New MyCustomClass()

これは、クラスが MyCustomClass と呼ばれ、INSTANCE が MyCustomSqlAdapter と呼ばれる場合です。

次に、ボタンで....のようにします。

dt = MyCustomSqlAdapter.readfunctioid("select fld_functionid  from tbl_users_function_permission")
于 2013-01-18T19:23:45.580 に答える