VB.NETでSqlClientを利用して複数テーブルを参照する方法

このQ&Aのポイント
  • VB.NETでSQLデータベースからデータを取得するプログラムを作成中です。複数のテーブルを参照する方法がわかりません。教えてください。
  • 現在、VB.NETでSQLデータベースからデータを取得するプログラムを作成しています。複数のテーブルを参照する方法を教えてください。
  • VB.NETでSQLデータベースからデータを取得するプログラムを作成していますが、複数のテーブルを参照する方法が分かりません。どうすればよいでしょうか?
回答を見る
  • ベストアンサー

VB.NETでSqlClientを利用して複数テーベルを見る方法

今VB.NETで SQLデータベースからデータを取得して動作するプログラムを作っているのですが、テーブルを複数参照する方法がわかりません。教えてください~ ■今のプログラム(おおざっぱに) Public DBcn As SqlClient.SqlConnection = Nothing Public SQLcmd As SqlClient.SqlCommand Dim dr As SqlDataReader DBcn = New SqlClient.SqlConnection SQLcmd = New SqlClient.SqlCommand DBcn.ConnectionString = "接続情報省略" DBcn.Open() SQLcmd.Connection = DBcn SQLcmd.CommandText = "select * from AAA " dr = SQLcmd.ExecuteReader() While dr.Read() = True   ※処理A End While このプログラムの処理Aの中に もう一度Select文で他のテーブル(データベース同じ)を参照したいのですが、どのようにすればよいのでしょうか? いろいろ試してみたのですがどれもできず;;困っております。

  • Haule
  • お礼率52% (125/240)

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 できれば「何を試したか」をざっとで良いのであげて欲しかった。でないと、「方法1はここが違うよ」などと指摘できない。想像するに、SqlConnection、SqlCommand、SqlDataReaderの各インスタンスを使いまわそうとしていたのではと思う。  .NetのSqlClientプロバイダはコネクションプーリングをサポートしているので、安心してもう一個ずつ各インスタンスを作成しよう。 While dr.Read() = True Dim DBcn2 As New SqlClient.SqlConnection Dim SQLcmd2 As New SqlClient.SqlCommand DBcn2.ConnectionString = "接続情報省略" DBcn2.Open() SQLcmd2.Connection = DBcn SQLcmd.CommandText = "select * from BBB " dim dr2 As SqlClient.SqlDataReader = SQLcmd2.ExecuteReader() ほげほげ dr2.Close() DBcn2.Close() DBcn2.Dispose() End While  Whileの外で宣言してOpenとCloseを毎回行わないようにしても良いだろう。ソースは今ここで打っただけで、テストしていないのでエラーが出たら直してください。

Haule
質問者

お礼

あーーごめんなさい。 ミスでした ☆SQLcmd2.Connection = DBcn  ↓ ☆SQLcmd2.Connection = DBcn2 ここが間違ってました~ ありがとうございましたー^^

Haule
質問者

補足

レスありがとうございます。 やってみたのですが、 ■プログラム変更(☆追加行) Public DBcn As SqlClient.SqlConnection = Nothing Public SQLcmd As SqlClient.SqlCommand Dim dr As SqlDataReader ☆Public DBcn2 As SqlClient.SqlConnection = Nothing ☆Public SQLcmd2 As SqlClient.SqlCommand ☆Dim dr2 As SqlDataReader DBcn = New SqlClient.SqlConnection SQLcmd = New SqlClient.SqlCommand DBcn.ConnectionString = "接続情報省略" DBcn.Open() SQLcmd.Connection = DBcn ☆DBcn2 = New SqlClient.SqlConnection ☆SQLcmd2 = New SqlClient.SqlCommand ☆DBcn2.ConnectionString = "接続情報省略" ☆DBcn2.Open() ☆SQLcmd2.Connection = DBcn SQLcmd.CommandText = "select * from AAA " dr = SQLcmd.ExecuteReader() While dr.Read() = True ←(2) ☆SQLcmd2.CommandText = "select * from BBB " ☆dr2 = SQLcmd2.ExecuteReader()←(1)エラー ☆While dr2.Read() = True   ※処理A ☆End While End While dr.Close() DBcn.Close() DBcn.Dispose() ☆dr2.Close() ☆DBcn2.Close() ☆DBcn2.Dispose() (1)のところで、 『'System.InvalidOperationException' のハンドルされていない例外が system.data.dll で発生しました。 追加情報 : この接続に関連付けられている DataReader が既に開いています。この DataReader を最初に閉じる必要があります。』 というエラーが発生します。 そこで(1)の前に dr2.close()をいれればなんとかとおるのですが、 (2)のところで、DataReaderが閉じているから開けみたいなエラーがでるのですが、開く関数がわかりません。 どうすればよいのでしょうか?

関連するQ&A

  • 複数SQL発行について

    お世話になります。 VB.NET2003とSQLServer2005にて開発を行っております。 Aテーブルからデータを取得してその取得データを元にBテーブルを参照する。 と、言うのがあるのですが、 Bテーブル参照時に「この接続に関連付けられている DataReader が既に開いています。この DataReader を最初に閉じる必要があります。」の エラーとなってしまいます。 複数SQLを発行する場合、再度接続を行わなければならないのでしょうか? 同一接続内で複数のSQLを発行することは出来ないのでしょうか? どなたかご存知でしたらお教え願います。 以下、ソース ' 変数宣言 Dim objDBConnect As SqlConnection Dim objDBTran As SqlTransaction Dim objSqlCmd As SqlCommand Dim objSqlDRA As SqlDataReader Dim objSqlDRB As SqlDataReader ' データベース接続 objDBConnect = New SqlConnection("接続文字列") objDBConnect.Open() ' トランザクション開始 objDBTran = objDBConnect.BeginTransaction(IsolationLevel.ReadCommitted) ' SQL発行 objSqlCmd = New SqlCommand("SELECT * FROM A_TABLE", objDBConnect) objSqlDRA = objSqlCmd.ExecuteReader() While objSqlDRA.Read() objSqlCmd = New SqlCommand("SELECT * FROM B_TABLE", objDBConnect) objSqlDRB = objSqlCmd.ExecuteReader() ←ここで、エラーとなってしまいます。 End While

  • 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 (以下省略)

  • C#でのSQLへのアクセスについて

    SQL Serverのテーブルをコンソール上に表示する為のコードを書いたのですが SqlConnection SqlCommand SqlDataReader に対してエラーが出しまい、修正方法が分からず、どなたか教えて頂けないでしょうか? 【ソースコード】 using System; using System.Configuration; using System.Data; using System.Data.SqlClient; using Microsoft.Data.SqlClient; static void Main(string[] args) { string connectionString = "Data Source=○○;Initial Catalog=○○;User ID=○○;Password=○○;"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlCommand command = new SqlCommand("SELECT * FROM [○○]", connection)) using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["column1"]); Console.WriteLine(reader["column2"]); } } } }

  • コンボボックスのSelectedItemの使い方

    エリアテーブルを取得し コンボボックスの見える値は「値」にして コンボボックスを取得するときには「コード」を 取れるようにしたいと思っています。 どのように書くと取得できるのでしょうか? バインドするやり方が分からなくて 下記のようになっています。 Dim strSql As String Dim dr As SqlClient.SqlDataReader = Nothing Dim daAdp As New SqlClient.SqlDataAdapter Dim cmd As New SqlClient.SqlCommand Dim ds As DataSet = New DataSet() mConn = New SqlConnection 'DBのオープン  Conn.DbConnect()   Dim dbCmd As SqlCommand = Nothing 'SQL発行 strSQL = "SELECT コード,値 " strSQL = strSQL & "FROM エリア" Conn.ExecSqlSelect(strSql, dr)   ComboBox1.Items.Clear() Do While dr.Read ComboBox1.Items.Add(dr.GetString(1)) ComboBox1.SelectedItem = dr.GetString(0) Loop

  • SQLServer2008のDate型について

    SQLServer2008のDate型についてお聞きします Date型には日付のみセットされると思うのですが VB2010から接続表示すると時刻データまで表示されてしまいます テーブルデータの表示では「20120305」 VBでは「20120305 0:00:00」 となっております。 期待する動作はVBで「20120305」と表示されることです 接続はこの様にしております。 Dim cn As New SqlConnection(ConnectionString~) Dim cmd As New SqlCommand("SELECT * FROM Test1", cn) cn.Open() Dim dr As SqlDataReader = cmd.ExecuteReader While dr.Read() Trace.WriteLine(dr("Date").ToString) End While なぜ時刻までセットされてしまうのか理解できません。 ご指導よろしくお願い致します。

  • VB2010 DBから値取得→パス指定で画像表示

    VB2010でPictureBoxを使用してデータベースから値を取得して PictureBox1.Image =System.Drawing.Image.FromFile("取得した値" & ".jpg") という形でPictureBoxに画像を表示させたいのですが FileNotFoundExceptionはハンドルされませんでした。とエラーが出てできません。 Dim command As SqlClient.SqlCommand = connection.CreateCommand() connection.Open() Dim dr As SqlClient.SqlDataReader command.CommandText = "SELECT s_code FROM テーブル名 ORDER BY s_code" dr = command.ExecuteReader() PictureBox1.Image =System.Drawing.Image.FromFile("..\..\pict" & "dr(s_code)" & ".jpg") データベースのs_codeとpictのフォルダ内にあるパスは一緒です。

  • VB.NETからのMDBへのデータ接続について教えてください。

    またまたお世話になります。 いろいろ教えていただきながらほとんど出来上がって今最後のログオン部分を作成中です。 VB.NET2003、アクセス2000使用です。 参考にしている本がAccess使いではなくMSDEを使用しているため、データ接続の部分が毎回違っています。 各フォームなどでは余り気にせずに進めたのですが、このログオン処理のところだけ引っかかって進むことが出来ません。 データリンクプロパティでAccessの場合はMicrosoft Jet4.0 OLE DB Providerを指定しなければならないようですが、この場合、Oledbconnectionが作成されます。 MSDEの場合、Sqlconnectionが作成されSQLは以下のように書かれます。 Dim cmd As Sqlclient.Sqlcommand = Sqlconnection1.CreateCommnad() Dim dr As SqlClient.SqlDataReader 'コマンドのコネクション設定 cmd.Connection = SqlConnection1 'コネクションを開く SqlConnection1.Open() OledbConnectionを使って書くにはどういう修正をしたらいいのか、ご教示いただきたくお願いします。

  • 共通モジュールでDBへの接続と利用方法

    VB.net のモジュールの引数にについての質問です。 やりたい事はSQLServerへの接続およびSELCT文を実行させることです DB側へのセッションをモジュールで作成し、 それを元に、他のモジュールやクラスファイルで selectやinsertを動かしたいと思っていますが、うまくいきません 「ExecuteReader には接続が開かれていて使用可能なことが必要です。 現在の接続の状態は終了です」というエラーが出てしまいます。 おそらく戻り値のあたりがおかしいのかなと思うのですが、 解決策がわかりません。 Module Connect Dim cn As System.Data.SqlClient.SqlConnection Public Function Connection() Try cn = New System.Data.SqlClient.SqlConnection() 'SQL Server認証を利用して接続 cn.ConnectionString = _ "Data Source = " & ServerName & _ ";Initial Catalog = " & DBName & _ ";User ID = " & UserID & _ ";Password = " & password 'Windows認証を利用して接続 'cn.ConnectionString = _ ' "Data Source = " & ServerName & _ ' ";Initial Catalog = " & DBName & _ ' ";Integrated Security = SSPI" cn.Open() MessageBox.Show("接続されました") Catch ex As Exception MessageBox.Show(ex.ToString) End Try Return cn End Function End Module Public Sub ExecuteReaderTest() Try Dim cn As New System.Data.SqlClient.SqlConnection Connection() Dim hCommand As System.Data.SqlClient.SqlCommand = cn.CreateCommand() hCommand.CommandText = "SELECT ~~ " Dim cReader As System.Data.SqlClient.SqlDataReader = hCommand.ExecuteReader() hCommand.Dispose() ......

  • <ASP.NET+C#+MSDE> JPEG画像の表示ができません。

    こんばんわ。 ASP.NET+C#+MSDEで開発を行っております。 MSDEのあるテーブルにImage型の項目を用意し、Access2000でリンクを張って、JPEG形式のファイルを登録しました。 ASP.NETの方のSQL文を書いて、画像を取得して表示させようとするのですが、「×」マークしか表示されません。IIS等の設定が悪いのでしょうか? コードはこんな感じです。 ================================================ SqlConnection sqlconn = new SqlConnection(ConfigurationSettings.AppSettings["DSNSTRING"]); SqlCommand sqlcmd = new SqlCommand("SELECT 画像 FROM 画像 WHERE 車番=@id",sqlconn); //パラメータの設定 sqlcmd.Parameters.Add("@id",SqlDbType.Int).Value = productid; //実行する SqlDataReader sqlreader; sqlconn.Open(); sqlreader = sqlcmd.ExecuteReader(); if(sqlreader.Read()) { byte [] b = (byte[])sqlreader.GetValue(0); Response.ContentType = "image/pjpeg"; Response.BinaryWrite(b); } else { Response.StatusCode = (int)HttpStatusCode.NotFound; Response.End(); return; } // 出力を閉じて終了 Response.End(); ================================================ どなたかアドバイスください。お願いします。

  • VC++でSELECT文の実行結果を表示

    開発環境は OS XPのHomeEditon Visual C++ ExpressEdition SQL Server 2005 Express です。 よろしくお願いします。 #include "stdafx.h" #include <stdio.h> #include <windows.h> #include <string> using namespace System; using namespace System::Data; using namespace System::Data::SqlClient; char a; void sub( SqlDataReader ^objRd ) { System::Diagnostics::Debug::WriteLine(objRd); while( objRd->Read() ) { System::Diagnostics::Debug::WriteLine(objRd->Read()); } } int main(void){ String^ str; SqlConnection^ sqlConn = gcnew SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\SOUTUKEN\\TEST.mdf;Integrated Security=True;User Instance=True"); sqlConn->Open(); str = "SELECT * FROM table1"; SqlCommand^ sqlCmd = gcnew SqlCommand(str,sqlConn); SqlDataReader^ exeReader = sqlCmd->ExecuteReader(); sub( exeReader ); sqlConn->Close(); } これの実行結果がboolean形で帰ってくるのですがこれを表内のデータが帰ってくるようにしたいのです。 少し知識不足なところもありますがどうかよろしくお願いします。

専門家に質問してみよう