3

以下を回避するための最も基本的な方法は何だろうと思っていました。

    con.ConnectionString = connection_String
    con.Open()
    cmd.Connection = con

    'database interaction here

    cmd.Close()

私は自分のプロジェクトでこれらの行を作り続けていますが、これを何度も入力する手間を省くためのより良い方法が必要だと思います。これにより、コードがさらにずさんに見えます。

これで終わって、私にとってはうまくいきます。助けてくれてありがとう :)

Public Sub connectionState()
    If con.State = 0 Then
        con.ConnectionString = connection_String
        con.Open()
        cmd.Connection = con
    Else
        con.Close()
    End If
End Sub
4

3 に答える 3

2

クラス(シングルトンクラス)を作成してみて、そのクラスにデータベース接続構文コードと例外を記述してから、1つのオブジェクトをメインクラスに呼び出してデータベース接続を作成します。これがパフォーマンスの点で最良の方法であり、同じことを書き続けることができます何度もコード...

于 2012-10-09T13:58:39.647 に答える
2

これは、多くのプログラマーが、次のようなメソッド シグネチャのバリエーションを持つ「データベース レイヤー」を作成する誘惑に駆られる場所です。

Public DataSet ExecuteSQL(ByVal sql As String) As DataSet

これにより、ボイラープレート接続コードをすべて 1 か所に分離できます。SQL コマンド文字列が入り、データが出てきます。簡単。

それをしないでください!

これは正しい方向に向かっていますが、非常に大きな欠点が 1 つあります。文字列操作を使用して、パラメーター値を SQL クエリに代入する必要があります。これは、恐ろしい sql インジェクション セキュリティの脆弱性につながります。

代わりに、メソッドに何らかのメカニズムを含めて、SQL パラメータを個別に入力するようにしてください。これは通常、関数への追加の引数の形式で提供され、KeyValuePairs の配列と同じくらい単純な場合があります。ラムダに慣れている場合、私の好みのパターンは次のようになります。

Public Iterator Function GetData(Of T)(ByVal sql As String, ByVal addParameters As Action(Of SqlParameterCollection), ByVal translate As Func(Of IDatarecord, T)) As IEnumerable(Of T)
    Using cn As New SqlConnection("connection string"), _
          cmd As New SqlCommand(sql, cn)

        addParameters(cmd.Parameters)

        cn.Open()
        Using rdr As SqlDataReader = cmd.ExecuteReader()
            While rdr.Read()
                Yield(translate(rdr))
            End While
        End Using
    End Using
End Function

その関数を呼び出すには、次のようにします。

Dim bigCustomers = GetData("SELECT * FROM Customers WHERE SalesTotal > @MinSalesTotal", _
                   Sub(p) p.Add("@MinSalesTotal", SqlDbType.Decimal, 1000000), _
                   MyCustomerClass.FromIDataRecord)
于 2012-10-09T14:07:58.053 に答える
0

using block処理の最後に、管理されていないオブジェクトに対して execute dispose を使用して、ちょうど使用できます。

リンク : http://msdn.microsoft.com/en-us/library/htd05whh(v=vs.80).aspx

于 2012-10-09T13:58:53.860 に答える