ASP.NET(VB.NET)でDACを使用した場合のSQLConnectionの取得方法とCloseの方法について教えてください

このQ&Aのポイント
  • 現在、ASP.NET(言語:VB.NET)にて、データ参照、更新系のWebアプリケーションを自学しています。しかし、DAC(Data Access Componet)を利用してSQL Serverのデータを取得、更新する際のコネクションの閉じ方が分からず困っています。DACを使用しない場合はSQLConnectionを明示的にCloseすることができますが、DACを使用した場合はTableAdapterからSQLConnectionを取得できず、同様の実装方法がわかりません。
  • DACを使用した場合は、テーブルアダプターのFillメソッドを呼び出すだけでSQLConnectionのCloseが保証されている場合もありますが、保証されていない場合や明示的にCloseさせたい場合はどのようにすれば良いのか知りたいです。
  • DACを使用した場合にSQLConnectionを取得する方法やCloseさせる方法について教えてください。
回答を見る
  • ベストアンサー

現在、ASP.NET(言語:VB.NET)にて、

現在、ASP.NET(言語:VB.NET)にて、 データ参照、更新系のWebアプリケーションを自学しているものですが、 DAC(Data Access Componet)を利用してSQL Serverのデータを取得、更新する際、 コネクションの閉じ方が分からず困っています。 DACを使用しない場合は、 下記のようにSQLConnectionをUsing句で明示的に括り、 Closeさせることができますが、 DACを使用した場合はTableAdapterからSQLConnectionを取得できず、 同様の実装方法を採れません。 ------------------ Dim mySelectQuery As String = "SELECT * FROM Categories ORDER BY CategoryID" Dim myConnectString As String = "Persist Security Info=False;Integrated Security=SSPI;database=northwind;server=mySQLServer" Dim myCommand As New SqlCommand(mySelectQuery) Using conn AS SqlConnection = New SqlConnection(myConnectString) myCommand.Connection =conn myCommand.CommandTimeout = 15 myCommand.CommandType = CommandType.Text myCommand.ExecuteNonQuery() End Using ------------------ 一方、DACを使用した場合は下記のように実装しております。 ------------------ Dim ta As New SystemError_OriginalTableAdapters.OriginalTableAdapter Dim dt As New SystemError_OriginalDataTable ta.FillBy(dt, id) ' テーブルアダプターのFillメソッドを呼び出すのみで、Closeしているかどうかがわからない。 ------------------ DACでは、Fillメソッド実行後に必ずSQLConnectionがCloseされることが 保証されているなら問題は無いのですが、 そうでない場合、テーブルアダプターからSQLConnectionを取得して、 明示的にCloseさせてやりたいと思っています。 DACを使用した場合のSQLConnectionの取得方法、 もしくはSQLConnectionのCloseの方法についてご教授願えないでしょうか? 以上、宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

明示的にOpen/Closeしないのがお勧め ---- DbDataAdapter.Fill メソッド http://msdn.microsoft.com/ja-jp/library/905keexk.aspx >Fill を呼び出す前に接続が閉じていた場合は、接続が開かれ、データを取得した後で再び閉じられます。 ---- ADO.NET パフォーマンスの向上 http://msdn.microsoft.com/ja-jp/library/ms998569.aspx > 1 つの Fill 処理または Update 処理を実行する場合、Fill メソッドを呼び出す前に接続を開かないでください。 > DataAdapter が自動的に接続を開閉するためです。 > SqlDataAdapter は自動的に接続を開き、選択されたコマンドを実行し、終了したら接続を閉じます。 > これにより、接続が開いている時間を最小限に抑えることができます。

hidewiki
質問者

お礼

回答ありがとうございます。 DACにコネクションの開閉を任せることとします。 該当ページの内容を理解して勉強を進めようと思います。 重ねて感謝いたします。

関連するQ&A

  • プロシージャまたは関数の引数が多すぎますのエラー

    お世話になります。 下記のコードを実行すると プロシージャまたは関数 spTest の引数が多すぎます どこが悪いのかご教示お願いいたします。 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim conn As New SqlConnection(connstr) Dim cmd As New SqlCommand conn.Open() cmd.Connection = conn cmd.CommandText = "Delete Table2" cmd.CommandType = CommandType.Text Debug.WriteLine(cmd.ExecuteNonQuery()) For i = 1 To 100 spTest(cmd, i) Next conn.Close() End Sub sub spTest(ByRef cmd As SqlCommand, ByVal intID As Integer) Dim param As SqlParameter With cmd .CommandType = CommandType.StoredProcedure .CommandText = "spTest" param = .Parameters.Add(New _ SqlParameter("@ID", SqlDbType.Int)) param.Value = intID .ExecuteNonQuery()    ''''' ここで2回目からエラーが発生します End With End sub

  • ASP.Net Web.Config 接続文字列が

    お世話になります。 Web.Config から 接続文字列を取得しようと下記のようなコードをサイトから学んだのですが、 Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionStringSQL").ConnectionString Dim conn As SqlConnection = New SqlConnection(conStr) これを実行すると、エラーになってしまいます。 "Provider=SQLOLEDB;Data Source=SERVER01;Integrated Security=SSPI;Initial Catalog=TESTSQL" 上記が接続文字列なのですが、Provider=SQLOLEDB この部分を取り除き、 "Data Source=SERVER01;Integrated Security=SSPI;Initial Catalog=TESTSQL" このように直接、接続文字列を上記のようにすると、問題なく動くのですが、何かおかしいと思うのですが、わたくしの方にミスや足りない個所があれば、是非、ご指摘いただければと存じます。 Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionStringSQL").ConnectionString Dim conn As SqlConnection = New SqlConnection(conStr) 上記のように記述して接続文字列を取得設定できればスマートだと思うのですが・・・・ よろしくお願いいたします。

  • ASP.NET

    VBで作成しています。 下記はSQLサーバーのデータベースを使ったプログラムですが、Microsoft Office Accessのデータベースを使う場合は、どのように変更すればいいでしょうか?教えて下さい。 お願いします。 <プログラム> Dim strSQL As String Dim sqlDa As SqlClient.SqlDataReader Dim dr As DataRow 'SQL文 strSQL = "SELECT * FROM Data1 Dim cmdSQL As New SqlClient.SqlCommand With cmdSQL .Connection = Action .CommandType = CommandType.Text .CommandText = strSQL End With Try Action.Open() sqlDa = cmdSQL.ExecuteReader (以下省略)

  • vb2005.netでCrystalReports

    クリスタルレポート初心者です。宜しくお願いします。 以下のソースでクリスタルレポートから印刷を行っていますが、最後にSQLSERVERのパスワード入力のダイアログが出てしまいます。 Dim cn As New SqlClient.SqlConnection Dim cmd As New SqlClient.SqlCommand Dim oDataAdapter As New SqlClient.SqlDataAdapter Dim oDataSet As DataSet = New DataSet Dim oCryRepo As HIJYUU = New HIJYUU cn.ConnectionString = "Server=192.168.1.1;Initial Catalog=TESTDB;ID=sa;Passworsd="pw001;" cn.Open() cmd.Connection = cn cmd.CommandText = "select * from h_tbl where ndate='" & "20110715" & "'" oDataAdapter.SelectCommand = cmd oDataSet.Clear() oDataAdapter.Fill(oDataSet, "H_TBL") oCryRepo.SetDataSource(oDataSet) crView.ReportSource = oCryRepo cn.Close() パスワード入力のダイアログを出さずに印刷する方法を教えていただきたいのですが。 その画面でパスワードを入力すれば正常に印刷されます。 環境はVB2005.NET、それにバンドルされているクリスタルレポート、sqlserver2008です。 以上、宜しくお願い致します。

  • <>&などを保存する方法をおしえてください。

    <>&などを保存する方法をおしえてください。 NameTextBox CommentTextBox 保存ボタン があり保存ボタンを押すと 下記コードが実行されるようにしました。 これで、保存はできるようになったのですが <>&などを使用するとエラーとなってしまします。 <>&を使用するにはどのようにしたらいいのでしょうか? 教えてください。 Dim strSQL As String = "INSERT INTO tableA (Name,Comment) VALUES (@Name,@Comment)" Using con As New SqlConnection(conStr) Dim command As New SqlCommand(strSQL, con) con.Open() Using cmd1 As SqlDataReader = con.CreateCommand() cmd1.CommandType = CommandType.Text Try with cmd1 .Parameters.Add("@Name", SqlDbType.NVarChar) .Parameters.Add("@Comment", SqlDbType.NVarChar) .Parameters("@Name").Value = NameTextBox .Parameters("@Comment").Value = CommentTextBox End With cmd1.CommandText = strSQL cmd1.ExecuteNonQuery() Catch er As Exception Finally con.Close() Catch ex As Exception Finally con.Close() End Try End Using End Using

  • ASP.NETでSQL-SERVERへの接続方法

    最近、ASP.NETの勉強をはじめました。テキストを見ながらサンプルプログラムを作成しているのですが、SQL-SERVERへのDB接続方法がうまくいきません。 Dim conn As String = "data source=????;user id=sa;password=;initial catalog=SampleDb" Try   Dim objConn As New SqlClient.SqlConnection   objConn.ConnectionString() = conn   Dim comm As New SqlClient.SqlCommand(sql, objConn)   objConn.Open() ソース一番上の????の部分に何と記述すればいいかわかりません。テキストには localhost と記述されています。コンパネの「ODBCデータソース」のDSNやサーバ名を記述しても無理でした。 ASP開発で使用していたDB接続 Conn = "PROVIDER=SQLOLEDB;SERVER=サーバ名;DATABASE=YUSODB;UID=sa;PWD=;" を試したりしたのですが、無理でした。 どなたかご教授お願いします。

  • DBへのコネクションタイムアウト

    こんにちは。 現在、VB.NETを用いて開発をしておりますが、DBがダウンしたときの タイムアウト時間の調整に苦慮しております。 タイムアウトは環境ファイルに5秒(デフォルトは15秒かと思います)を設定しております。しかし、DBがダウンしておるとき以下の★の個所で約30秒以上経過しないとエラーが戻ってきません。 タイムアウトのパラメータは認識しているようですが、秒数を変更しても状況は変わらずです。 Using sqlConnection As New SqlConnection Using sqlCommand As New SqlCommand sqlCommand.Connection = sqlConnection sqlCommand.CommandText = "SELECT * FROM TEST" Dim dataAdpt As New SqlDataAdapter Dim dataTble As New DataTable() dataAdp.SelectCommand = sqlCommand dataAdp.Fill(dataTble)★ ~ ご存知の方いらっしゃいましたらご教示願います。

  • ASP.NETからのデータベースの作成

    こんにちは。 SQL SERVER 2005 ExpressとIIS5.0とASP.NET2.0+C#で使っています。 一台のサーバーマシンに、SQL SERVER 2005 ExpressとIIS5.0をインストールした状態なのですが、Webページ上のC#のプログラムよりデータベースを作成しようとすると、 CREATE DATABASE 権限がデータベース 'master' で拒否されました。 と、メッセージが出ます。 要するに権限がないというのはわかるのですが、このようにWebからログインしてきたユーザーに権限を付加することはできるのでしょうか? あるいは、接続文字列かなんかで権限のあるユーザーでログインする、といったことが可能なものでしょうか? 現在は以下のようにして接続、作成を行おうとしています。 SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Server=.\\SQLEXPRESS;Integrated security=SSPI"; String strDatabase = "CREATE DATABASE newdatabase"; SqlCommand cmdDatabase = new SqlCommand(strDatabase, conn); conn.Open(); cmdDatabase.ExecuteNonQuery(); conn.Close(); エラーの内容から、SQL SERVERそのものへのアクセスは成功しているように思えます。 よろしくお願いします。

  • VB.Net SqlCommand 共通に

    お世話になります。 VB.Net 駆け出しの者です。 SqlCommand を使いストアドプロシジャーを実行して戻り値を DateSet にするような関数はプログラムを作っていくと、かなり多数になるようになりました。接続文字列だったり、いろいろ同じような記述が続いているなと思っておりました。 そこで、以下のような関数を作り、この部分を使いまわせないものかと思っております。 ストアドプロシジャーの名前や、そのほか必要な部分の文字はすべて変数にして、なんとか使えないのかなと思っているのですが、問題なのは、パラメータの部分でうまくいかないのです。 パラメータの部分だけ別関数にして、なんとかねじこめないかなと思っているのですが・・・ そもそもこういうやり方が正しいのかどうかもわからないのですが、その辺りも含めご教授いただければ幸いでございます。 何卒よろしくお願いいたします。 Public Function CommonDataSet(ByVal NameStored As String, ByVal CMDPara As SqlCommand, ByVal BasicTableName As String, ByVal ErrStr As String, ByVal ErrStrCaption As String) As DataSet     Dim SQLCon As SqlConnection = New SqlConnection(CMO.GetConnectStrings())     Try       CMDPara = New SqlCommand(NameStored, SQLCon)       CMDPara.CommandType = CommandType.StoredProcedure       SQLCon.Open()       Dim custDA As SqlDataAdapter = New SqlDataAdapter       Dim custDS As DataSet = New DataSet       ’この部分で下記の関数でパラメータを設定したいのですが、うまくいきません       custDA.SelectCommand = CMDPara       custDA.Fill(custDS, BasicTableName)       CommonDataSet = custDS     Catch ex As Exception       Err.Raise(Err.Number)       MessageBox.Show(ErrStr, ErrStrCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning)       CommonDataSet = Nothing     End Try     If SQLCon.State <> ConnectionState.Closed Then       SQLCon.Close()       SQLCon.Dispose()     End If End Function パラメータを設定する関数 上の関数の引数として設定したいのです  ByVal CMDPara As SqlCommand の部分のパラメータとして Private Function CommonPara(CMD As SqlCommand) As SqlCommand     CMD.Parameters.Clear()     CMD.Parameters.Add(New SqlParameter(パラメータ1の記述)     CMD.Parameters.Add(New SqlParameter(パラメータ2の記述)     CMD.Parameters.Add(New SqlParameter(パラメータ3の記述)     CommonPara = CMD End Function

  • ASP.NETでIPアドレスログイン管理を教えてください

    こんばんわ。 現在、クライアントのIPアドレスを取得してSQLServerテーブルでログイン管理をするWebを作成したいと思っております。 ずっと調べていたのですが分からず、実はまだASP.NET自体あまり理解できておりません。書籍などで勉強してから投稿しろ!と思われるかもしれませんが時間がなく困っています。 どうかご教示を宜しくお願い致します。 わかる範囲で.vbにコードを書いてみましたがIPアドレスを取得してSQL Serverに接続後にIF文でエラーメッセージとメインページ表示を分岐したいのですが分らないのです。。。 Partial Class INDEX Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load 'ページを初期化するユーザーコードをここに挿入します。 If Not IsPostBack Then '---------IPアドレス取得--------------- Dim strHost As String Dim ip As System.Net.IPHostEntry Dim ipAddr As System.Net.IPAddress 'ホスト名を取得 strHost = System.Net.Dns.GetHostName() 'IPリストを取得 ip = System.Net.Dns.GetHostByName(strHost) 'IPリストの最初を取得 ipAddr = ip.AddressList(0) '---------SQL接続--------------- Dim cn As SqlConnection = New SqlConnection("Server=servername;database=data;UID=id;PWD=pass") Dim cmd As SqlCommand = New SqlCommand("SELECT * FROM IPAdd WHERE IP='" & ipAddr & "' AND Authority1='True'") cn.Open() Dim reader As SqlDataReader = cmd.ExecuteReader() DemoGrid.DataSource = reader DataBind() reader.Close() cn.Close() End If End Sub End Class

専門家に質問してみよう