質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

1回答

5528閲覧

VB ローカルDB(.mdf) ファイルにSQL serverから テーブルごとデータを引っ張りたい。

hamaa

総合スコア45

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

2クリップ

投稿2016/09/05 12:31

Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim cn As String : cn = "Provider='SQLOLEDB';Data Source='IPアドレス';Initial Catalog='サーバー名';User ID='myID';Password='パスワード'"

Dim cn2 As String : cn2 = "Data Source=.\SQLEXPRESS;AttachDbFilename=ローカル.mdfフルパス;Integrated Security=True;MultipleActiveResultSets=True;User Instance=True"

Dim strSQL As String Dim strSQL2 As String strSQL = "SELECT * FROM [マスターテーブル]" strSQL2 = "SELECT * FROM [ローカルテーブル]" rs.Open(strSQL, cn, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic) If rs.EOF = False Then'マスターテーブルがあったなら Dim Con As New SqlConnection Dim sqlCommand As SqlCommand = Nothing Dim sqlReader As SqlDataReader = Nothing Con.ConnectionString = cn2 Try Con.Open() Debug.Print("オープン成功") sqlCommand = New SqlCommand("DELETE FROM [ローカルテーブル]", Con) '削除 Dim myint As Integer : myint = sqlCommand.ExecuteNonQuery '実行

ここまでうまくいっています。
SQLserverに マスターがあったらローカルのmdfファイルを空にして…
こっから マスターテーブルごと更新したいんですが… うまくいっていません。
この先の書き方… または、もっときれいな書き方教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twck

2016/09/06 11:49

2つ質問させてください。 質問1つ目:「マスターテーブルがあったなら」と書いてありますが、これは「マスターテーブルの中にデータが1件以上あったなら」ですか?それとも「データが0件でもマスターテーブルが存在さえしていたら」ですか? 質問2つ目:テーブルの中のフィールド名はプログラムを作っている段階で分かっていますか?それとも実行するときまで分かりませんか?
guest

回答1

0

ベストアンサー

質問文に書かれていないことは想像で作成しました。
ADO と ADO.NET が混在しているので ADO.NET に統一しました。
マスターテーブルがあるかどうかのチェックはしません。
VB6 から移植したと思われるコードは VB.NET風に書き直しました。
マスターテーブルのフィールド名は自動で取得するようにしました。
マスターテーブルとローカルテーブルのフィールドは同じであるものとします。
サンプルコードなので例外処理はしていません。

VB.NET

1'Connection String 接続文字列 2Dim cs1 = "Data Source=IPアドレス;Initial Catalog=データベース名;Persist Security Info=True;User ID=ユーザーID;Password=パスワード" 3Dim cs2 = "Data Source=.\SQLEXPRESS;AttachDbFilename=ローカル.mdfフルパス;Integrated Security=True;MultipleActiveResultSets=True;User Instance=True" 4 5'マスターテーブルとローカルテーブルのテーブル名 6Dim tableName1 = "マスターテーブル名" 7Dim tableName2 = "ローカルテーブル名" 8 9'マスターDBとローカルDBのオープン 10Using db1 As New SqlConnection(cs1), db2 As New SqlConnection(cs2) 11 db1.Open() 12 db2.Open() 13 14 'ローカルテーブルのデータを削除する 15 Dim cmd2 = db2.CreateCommand() 16 cmd2.CommandText = "DELETE FROM " & tableName2 17 cmd2.ExecuteNonQuery() 18 19 'マスターテーブルのデータを読み込む 20 Dim cmd1 = db1.CreateCommand() 21 cmd1.CommandText = "SELECT * FROM " & tableName1 22 Using reader = cmd1.ExecuteReader 23 24 '読み込んだスキーマ情報からフィールド名を取得してリスト化する 25 '読み込んだスキーマ情報からフィールド名とデータ型を取得してパラメーターを作る 26 Dim listFieldName As New List(Of String) 27 Dim params2 = cmd2.Parameters 28 params2.Clear() 29 For Each row As System.Data.DataRow In reader.GetSchemaTable.Rows 30 31 'フィールド名のリスト化 32 Dim fieldname = row("ColumnName").ToString 33 listFieldName.Add(fieldname) 34 35 'パラメーターの生成 36 Dim sqlDbType = DirectCast(row("ProviderType"), SqlDbType) 37 params2.Add(New SqlParameter(fieldname, sqlDbType)) 38 Next 39 40 'リスト化したフィールド名を使用して INSERT文を作成する 41 Dim arrayFields = listFieldName.ToArray() 42 cmd2.CommandText = "INSERT INTO " & tableName2 & " (" & _ 43 String.Join(", ", arrayFields) & _ 44 ") VALUES (@" & _ 45 String.Join(", @", arrayFields) & _ 46 ")" 47 48 'マスターテーブルのデータを1件ずつ読み込みローカルテーブルにINSERTする 49 Do While reader.Read 50 51 '全フィールドの値をパラメーターにセットする 52 For index As Integer = 0 To params2.Count - 1 53 params2(index).Value = reader(index) 54 Next 55 56 'INSERT文を発行する 57 cmd2.ExecuteNonQuery() 58 Loop 59 End Using 60End Using

投稿2016/09/07 00:58

編集2016/09/14 03:07
twck

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hamaa

2016/09/07 13:24

twckさん!! 質問返す タイミング 遅れて申し訳ございません。 質問の回答としては…マスターテーブルの中にデータが1件以上あったなら テーブルの中のフィールド名はプログラムを作っている段階で分かっています ありがとうごさいます。大変参考になりました。 ADO と ADO.NETの違いすら理解してませんでした!! この問題はtwckさんよって解決されましたが もう初心者なので次から次へと困っています。。。 https://teratail.com/questions/47172?complete=
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問