VB.NETでDataTableにデータ追加する方法

このQ&Aのポイント
  • VB.NETでDataTableにデータを一括追加する方法を教えてください。
  • VisualStugio.Net2003でSQLのSELECT文を実行して、実行結果をDataTableに格納したいです。
  • 2つのSQL結果を一つのDataTableに追加する方法を教えてください。
回答を見る
  • ベストアンサー

VB.NETでDataTableにデータ追加したい

VisualStugio.Net2003でソースコードを記述しており、コード内でSQLのSELECT文を実行して、実行結果をDataTableに格納する処理をしています。 今回、とあるテーブルに対し2パターンのSQLを実行し、それぞれの実行結果を1つのDataTableに格納したいのですが、どのようにすれば良いでしょうか? 自分で調べたところ、先に実行したSQL結果に、後から実行したSQL結果を1行ずつ追加するといった方法は見つかりましたが、1行ずつではなく、一括で追加する方法が知りたいです。 前提として、2回のSQL実行では、同じテーブルの同じ項目をSELECTしております。 下記に簡単ですがコード記述の概要を補足しておきます。 ・コード記述概要 【変数宣言】 Dim DB1 As DataTable Dim DB2 As DataTable 【SQL文1】 SELECT A,B,C FROM テーブル1 WHERE 条件文1 DB1 = SQL文1の実行結果 【SQL文2】 SELECT A,B,C FROM テーブル1 WHERE 条件文2 DB2 = SQL文2の実行結果 【DB1にDB2のデータを追加】←ここのやり方を知りたいです DB1 = DB1 + DB2 よろしくお願いいたします。

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

  • ベストアンサー
noname#212058
noname#212058
回答No.1

DataTable の Merge メソッドを使ってはいかがですか?

参考URL:
http://msdn.microsoft.com/ja-jp/library/system.data.datatable.merge%28v=vs.110%29.aspx
re_na_chu
質問者

お礼

ご回答ありがとうございました。 ご紹介頂いたMergeメソッドを試そうと思ったのですが、当方で参照設定していた.NET FRAMEWORKのバージョンが1.1ということがわかり、このバージョンではDatatable.Mergeが使えないようでした。(まさかそんな旧バージョンとは思っていませんでした・・・) 1.1でもDataset.Mergeは使えるようでしたが、かなり複雑なコードになりそうでしたので、今回はMergeメソッドの利用は諦め、SQL文でUNION結合する対応をとることにしました。 ただ、もっとバージョンが新しい.NET FRAMEWORKを利用しているプログラムも別にありますので、そこでDatatableの追加が必要な際には、ぜひMergeメソッドを利用させて貰いたいです。 ありがとうございました。

その他の回答 (1)

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.2

こんにちは もしご質問の内容が、詳細を知られたくなくて簡略化したものでなければ 【SQL文1】 SELECT A,B,C FROM テーブル1 WHERE 条件文1 DB1 = SQL文1の実行結果 【SQL文2】 SELECT A,B,C FROM テーブル1 WHERE 条件文2 DB2 = SQL文2の実行結果 をまとめて、 【SQL文1】 SELECT A,B,C FROM テーブル1 WHERE 条件文1 OR 条件文2 DB1 = SQL文1の実行結果 とすれば、どちらかの条件に当てはまるものを一括で取り出せます。

re_na_chu
質問者

お礼

ご回答ありがとうございました。 記述頂いているように、本来はSQL文1回で全部持ってくるのが一番なんですよね・・・。 今回の場合、SQL文1とSQL文2それぞれが複数のテーブルと結合しており(すみません、結合については説明をわかりやすくする為省力しておりました)、1つのSQL文にするとかなり長い記述になり、後から見た時に何をしているのかわかりづらくなることを危惧しておりました。 また、フォーム画面にラジオボタンを設置しており、ボタンAをチェックした場合はSQL文1、ボタンBをチェックした場合はSQL文2、ボタンCをチェックした場合は、SQL文1+SQL文2の結果を返す仕組みにしたかった為、あえてSQL文をわけてDatatableに格納する方策を取っておりました。 とはいえ、やはりSQL一発で結果を持ってくる方が良いと思い直しましたので、今回はUNION結合で対応したいと思います。 ありがとうございました。

関連するQ&A

  • VB.NET DataTableについて

    質問失礼します。 VB.Netで、テーブルに格納されたデータをDataTableを利用し、SQLを実行、抽出してきました。 その結果から、さらに抽出したいのですが、方法がわかりません。 dataに格納したものは、問題なく抽出できています。(データセットビジュアライザーで確認済み) 以下、 番号 名前 合計 1 りんご 10 2 ぶどう 20 3 りんご 30 の、ように3行結果が取れました。 そこから、名前が重複していル値があるかどうか、またその数を確認したいです。 (りんごが、2行ある) この方法がどうしてもわからず、 Dim rows As DataRow() から rows = data.Select("名前 = りんご") とすれば、りんごが2行あると数がわかりますが、 これが、りんごとは、限らないため、 重複している名前があるか、どうかを調べたいところです。 勉強して、まだ浅く、わかりづらい説明で申し訳ありませんが、ご回答のよろしくお願いします。

  • 【ASP.NET】MySQLのテーブルレコードの検索結果について

    お世話になります。ASP.NETおよびMySQLに関する質問です。 現在、ASP.NETで開発をおこなっております。 データベースにはMySQLを使用しており、以下の内容でSELECT文を 発行してテーブルレコードを取得しております。 ------------------------------------------------------ Private Function fcSelect_Table As DataTable Dim dt As New DataTable 'DB接続文字列の設定 Dim connectionString As String connectionString = "server=localhost;database=db01;user id=xxx; password=xxx;" 'DB接続 Dim _Connection As New MySqlConnection(connectionString) _Connection.Open() Dim cmd As MySqlCommand = _Connection.CreateCommand() Dim dr As MySqlDataReader = Nothing Try 'SQL文の作成 sql.Length = 0 'SELECT sql.Append(" SELECT " & vbCrLf) sql.Append(" ,AFFI_CODE " & vbCrLf) sql.Append(" ,REGIST_NUM " & vbCrLf) sql.Append(" ,KIND " & vbCrLf) 'FROM sql.Append(" FROM TBL_TEST " & vbCrLf) 'WHERE sql.Append(" WHERE " & vbCrLf) sql.Append(" AND AFFI_CODE = '" & Trim(tfx_所属.Text) & "'" & vbCrLf) sql.Append(" AND REGIST_NUM = '" & Trim(tfn_登録番号.Text) & "'" & vbCrLf) sql.Append(" AND KIND = '" & DropDownList_種別.SelectedIndex & "'" & vbCrLf) 'MySQLCommand作成 cmd.CommandText = sql.ToString 'SQL文実行 dr = cmd.ExecuteReader()       // 正常処理されることを確認済 // ここにDataTable型オブジェクトdt にdrの内容を格納する処理が必要? Catch ex As Exception End Try Return dt End Function ------------------------------------------------------ 上記で取得した結果をDataTableに格納し、それを画面に表示させたいのですが、DataTableへの格納方法がわかりません。 どなたかご教授いただけないでしょうか?

  • DataTableの使い方についてアドバイス

    VB2008、SQLServer2008で開発しています。 フォームにリストボックス、ボタンを追加します。 リストにはテーブルから全データを表示します。 選択後、ボタンを押すと選択されたデータのコードを テーブルに書込みにいきます。 こういうものを作る場合、DataTableはフォームクラスでパブリックで作り 書込みで使うコードもDataTableから取得し フォームが終わるときに解放するのでしょうか? DataTableがオブジェクトとしてある間はDBにつなぎっぱなしでしょうか?

  • フォーム上のフィルタで抽出されたデータをテーブルに格納したい

    フォーム上のフィルタで抽出されたデータをテーブルに格納したい 度々お世話になります。 フォーム上で3つのキーワードを使って抽出したデータを テーブルに格納したいと思っています。 以下のコードを書いたところ、矢印の部分でエラーが起こります。 お知恵を拝借できませんでしょうか? よろしくお願いいたします。 Private Sub cmd04_Click() Dim db As DAO.Database Set db = CurrentDb() Dim mySQL As String mySQL = "INSERT INTO 04_パソコン機器管理台帳 select * FROM T05_使用者一覧抽出結果 WHERE " & Me.Filter & ";" If MsgBox("該当レコードを追加します。", vbYesNo) = vbYes Then ' SQLを実行します。 db.Execute mySQL   ←エラーが発生します。 MsgBox "該当レコードを追加しました。" End If End Sub

  • VBでSQLを使い検索をしたいのですが。

    VBでSQLを使い検索をしたいのですが、SELECT文の使い方が分かりません。 下記の記述で、番号、氏名、電話番号をそれぞれのTEXTBOX1,TEXTBOX2,TEXTBOX3の ように各容器にいれたいのでが分かりません。 文をその文増やせばいいのでしょうか、SELECT文1行で複数の結果を受け取る方法を教えて下さい。 宜しくお願い致します。 Dim Adapter As New OleDbDataAdapter(SQLCm) Dim Table As New DataTable Dim name As String Dim selcomd As String Dim Value As String name = TextBox11.Text selcomd = "SELECT 番号,氏名,電話番号  FROM meishi WHERE 氏名 like '" & name & "' " SQLCm.CommandText = selcomd

  • vbでDataTableの抽出コピー

    vbでDataTableの抽出コピー DataTableから条件抽出したデータで別のDataTableを作成したい ・DataTable1から条件抽出したデータで別のDataTableを作成したい ・データの件数が違うだけでヘッダーなどの内容は同じにしたい Dim DataTable1 As DataTable ' 既にテーブルデータが入っているとする Dim DataTable2 As DataTable ' これに一部のデータとヘッダーを複写 Dim DataRow1 As DataRow ' DataRowの一時領域1 Dim DataRow2 As DataRow ' DataRowの一時領域2 <試作1:NG DataRowの使いまわしがきかない> DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataTable2.Rows.Add(DataRow1) Next DataRow1 <試作2:NG ワンクッションかましただけではダメ> DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataRow2 = DataRow1 DataTable2.Rows.Add(DataRow2) Next DataRow1 もしかして、個別セット以外に道はないのでしょうか? DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataRow2 = DataTable2.NewRow DataRow2("item1") = DataRow1("item1") DataRow2("item2") = DataRow1("item2") DataRow2("item3") = DataRow1("item3") DataRow2("item4") = DataRow1("item4") DataRow2("item5") = DataRow1("item5") DataRow2("item6") = DataRow1("item6") DataRow2("item7") = DataRow1("item7") DataRow2("item8") = DataRow1("item8") DataTable2.Rows.Add(DataRow2) Next DataRow1 何か良い方法はありませんか?

  • レコードが追加できない

    SQL-Server2010を使用しています。 レコードを追加する際にキー項目が存在する場合は追加しないようなSQL文を作成しました。 追加するテーブルにレコードが1件以上あれば思ったとおりの処理となりますが、 1件も存在しない場合は追加できません。 下記がそのSQL文です。 原因と対策方法を教えて頂けませんでしょうか? INSERT INTO foo(商品コード, 商品名) SELECT DISTINCT 'ABC123' , 'りんご' FROM foo WHERE NOT EXISTS( SELECT * FROM foo WHERE 商品コード = 'ABC123' ) 以上です。 宜しくお願い致します。

  • DataTableにデータを用意した後DBに反映する方法

    VB2008 SQLServer2008で開発しています。 DBにデータを追加したいと思っています。 DataTableを作成しているので これを使って簡単にDBにデータを追加することは できないでしょうか? そのやり方の場合 insert文を1行ずつ実行するのと処理時間に差はあるのでしょうか?

  • オラクルからAccessにデータ追加

    オラクルから、必要なデータを抜出し加工の為のDBをAccessで作成していますが、オラクルから抜き出したデータ(レコードセット)を、どうやってAccessのテーブルに書き込めばよいかがわかりません。 ◎環境 Oracle:10g Access:2010 ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) For i = 1 To 10 Debug.Print rs(カラム1) & rs(カラム2) next i ここまでは、オラクルのテーブルから、レコードセットにデータが取り込まれてます。 rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 案1 レコードセットのデータを、Access側のテーブルにループで回して、1行ずつデータ追加 案2 INTO句で直接、テーブル作成 調べていて、2通りのやり方があると思うのですが、どちらにしても、テーブルへの書き込み方がわかりません。 案1の場合、Access側のテーブルを開いてデータ追加する方法 ※同時に2つのテーブルを開くことになるのでは? 案2の場合、SQL文はオラクルで処理する為の物なので、AccessテーブルのINTO句が使えるのか? オラクルのテーブルをリンクする事も考えたのですが、実際動かすPCにはAccessRuntimeしかインストールしてませんので、オラクルのテーブルをリンクしてくれませんでした。 よい方法があれば、アドバイスを頂けたら幸いです。

  • sqliteへのデータ追加

    sql文で質問です。接続は1-29の表示を確認済み。 掲示板を作る練習をしているのですが、とりあえずpostなどのユーザーから受け取り値をdbに保存・表示する前に、自分で保存(カラムは左から順にid,name,sexになっていてidの1~29は埋まっている状態です。)・表示してみようと思いtest.dbのhumanテーブルに「データの追加」と表記している部分をテーブルに書き込み表示したいのですが、エラーは表示されないもののid30番にデータの追加ができておらず困っています。 データを追加する方法を教えてください。 <?php // 変数の初期化 $db = null; $sql = null; $res = null; $row = null; $db = new SQLite3("test.db"); // データの追加 $sql = 'INSERT INTO human( id, name, sex, ) VALUES ( 30, "吉川", "男", )'; // データの取得 $sql = 'SELECT * FROM human WHERE id BETWEEN 1 AND 50;'; $res = $db->query($sql); while( $row = $res->fetchArray() ) { echo '<ul>'.'<li>'. $row[0] . $row[1] .$row[2].'<li>'.'<ul>';} ?>

専門家に質問してみよう