2012-04-11 8 views
0

関数内で開いているSQL接続をどのように閉じることができますか?ASP.NET(VB) - 関数内で開いているSQL接続を閉じる

私はこのような選択機能を呼び出す

Function Selec(ByVal SQLStr As String) As SqlDataReader 

     Dim SQLConn As New SqlConnection() 
     Dim SQLCmd As New SqlCommand() 

     SQLConn.ConnectionString = Session("bd") 
     SQLConn.Open() 

     SQLCmd.Connection = SQLConn 
     SQLCmd.CommandText = SQLStr 

     Selec = SQLCmd.ExecuteReader 

    End Function 

そして、私は私にこのようなデータを取得するために、一方でメソッドを実行する別のページで:

:BDcon.BDがあります機能を持つクラスの名前)

Dim write as New BDcon.BD 

    Dim menu As SqlDataReader = writeBD.Selec("SELECT something from Table") 

While menu.Read 

    'Do something 

End While 

    menu.Close 'This close just the DataReader and not the SqlConnection 

最後に、私はこのような機能により、私のSQL接続を閉じたい:

Function Close() As SqlConnection 

     Dim SQLConn As New SqlConnection() 
     SQLConn.ConnectionString = Session("bd") 

     SQLConn.Close() 

    End Function 

私は問題がClose()にあると思います。機能は、接続を終了したいのですが、開かれたコネネットを呼び出す方法はわかりません。

+0

あなたのために働いていますか? –

答えて

1

私はあなたもこのためCommandBehavior Enumeration

読むを利用することができます

using cn as new system.data.sqlclient.sqlconnection() 
    cn.open 
    '{do a bunch of other stuff with commands and datareaders here} 
    cn.close 
end using 

または

...その優れたconsructはあなたのための作業を行います使用するために行くと思う:ExecuteReader with CommanBehavior (automatically close connection after reading data)

CloseConnection - コマンドが実行されると、関連付けられたConnectionオブジェクトは、関連するDataReader ob jectが閉じられています。

0

私の意見では、DataTableを返してすぐに接続を閉じるように関数を変更する必要があります。
例は

Function Select(ByVal SQLStr As String) As DataTable 
    Dim SQLConn As New SqlConnection(Session("bd")) 
    Dim SQLCmd As New SqlCommand(SQLStr, SQLConn) 
    Dim SQLAdapt As New SqlDataAdapter(SQLCmd) 
    Dim SQLDt As New DataTable() 
    SQLAdapt.Fill(SQLDt) 
    SQLConn.Close() 
    Return SQLDt 
End Function 

かもしれそれとも、機能GetConnection作成とのSQLConnectionを返すがありますし、手動で接続を閉じる(内部新しいものを作成せず)Select機能にこれを渡すことができます。

0

以前に作成したClose関数の引数としてSqlConnectionクラスのオブジェクトを渡す必要があると思います。 そのオブジェクトをその関数で使用します。

0

元のコードでは、接続オブジェクトのスコープがそれを作成した関数にしかないので(元の関数内でのみアクセスできます)、元の接続を閉じることはできません。私はMarcoの答えに同意する、あなたはSQLDataReaderではなくDataTableを返す必要があります。これは、SqlDataAdapterオブジェクトを必要としない、少し異なるアプローチです:返されたテーブルを使用するための

Function Selec(ByVal SQLStr As String) As DataTable 
    Dim SQLConn As New SqlConnection(Session("bd")) 
    Dim SQLCmd As New SqlCommand(SQLStr, SQLConn) 
    Dim SQLDt As New DataTable() 
    SQLConn.Open() 
    SQLDt.Load(SQLCmd.ExecuteReader) 
    'Close the connection as soon as it is no longer needed 
    SQLConn.Close() 
    Return SQLDt 
End Function 

、あなたがたDataRowのコレクションを、この道を歩くことができます:

Sub DoSomthing() 
    Dim menu As DataTable = Selec("SELECT * FROM SomeTable") 
    For Each row As DataRow In menu.Rows 
     ' do something 
    Next 
End Sub 

別の方法は次のようになり

Sub AlternateDoSomething() 
    Dim dt As DataTable = Selec("SELECT * FROM SomeTable") 
    Dim menu As DataTableReader = dt.CreateDataReader 
    While menu.Read 
     'Do something 
    End While 
    menu.Close() 
End Sub 
+0

ありがとう皆さん! – B1GB0Y

0

私がしました:私はそれはあなたの元のコードに似ている以外ので、他のことにどんな利点が表示されませんが、返されたDataTableを超えるDataTableReaderを作成しますPranay Ranaの返事で私の問題を解決しました。

コードにCommandBehavior.CloseConnectionを追加しました。セレク機能の

決勝コード:

Function Selec(ByVal SQLStr As String) As SqlDataReader 

     Dim SQLConn As New SqlConnection() 
     Dim SQLCmd As New SqlCommand() 

     SQLConn.ConnectionString = Session("bd") 
     SQLConn.Open() 

     SQLCmd.Connection = SQLConn 
     SQLCmd.CommandText = SQLStr 

     Selec = SQLCmd.ExecuteReader(CommandBehavior.CloseConnection) 

    End Function 

はALLありがとうございました! :D

関連する問題