質問: sqlCommand.ExecuteNonQuery '実行 ここまでうまくいっています。 SQLserverに マスターがあったらローカルのmdfファイルを空にして... こっから マスターテーブルごと更新したいんですが... うまくいっていません。 この先の書き方... または、もっときれいな書き方教えてください。
回答: 質問文に書かれていないことは想像で作成しました。 ADO と ADO.NET が混在しているので ADO.NET に統一しました。 マスターテーブルがあるかどうかのチェックはしません。 VB6 から移植したと思われるコードは VB.NET風に書き直しました。 マスターテーブルのフィールド名は自動で取得するようにしました。 マスターテーブルとローカルテーブルのフィールドは同じであるものとします。 サンプルコードなので例外処理はしていません。 ``` 'Connection String 接続文字列 Dim cs1 = "Data Source=IPアドレス;Initial Catalog=データベース名;Persist Security Info=True;User ID=ユーザーID;Password=パスワード" Dim cs2 = "Data Source=.\SQLEXPRESS;AttachDbFilename=ローカル.mdfフルパス;Integrated Security=True;MultipleActiveResultSets=True;User Instance=True" 'マスターテーブルとローカルテーブルのテーブル名 Dim tableName1 = "マスターテーブル名" Dim tableName2 = "ローカルテーブル名" 'マスターDBとローカルDBのオープン Using db1 As New SqlConnection(cs1), db2 As New SqlConnection(cs2) db1.Open() db2.Open() 'ローカルテーブルのデータを削除する Dim cmd2 = db2.CreateCommand() cmd2.CommandText = "DELETE FROM " & tableName2 cmd2.ExecuteNonQuery() 'マスターテーブルのデータを読み込む Dim cmd1 = db1.CreateCommand() cmd1.CommandText = "SELECT * FROM " & tableName1 Using reader = cmd1.ExecuteReader '読み込んだスキーマ情報からフィールド名を取得してリスト化する '読み込んだスキーマ情報からフィールド名とデータ型を取得してパラメーターを作る Dim listFieldName As New List(Of String) Dim params2 = cmd2.Parameters params2.Clear() For Each row As System.Data.DataRow In reader.GetSchemaTable.Rows 'フィールド名のリスト化 Dim fieldname = row("ColumnName").ToString listFieldName.Add(fieldname) 'パラメーターの生成 Dim sqlDbType = DirectCast(row("ProviderType"), SqlDbType) params2.Add(New SqlParameter(fieldname, sqlDbType)) Next 'リスト化したフィールド名を使用して INSERT文を作成する Dim arrayFields = listFieldName.ToArray() cmd2.CommandText = "INSERT INTO " & tableName2 & " (" & _ String.Join(", ", arrayFields) & _ ") VALUES (@" & _ String.Join(", @", arrayFields) & _ ")" 'マスターテーブルのデータを1件ずつ読み込みローカルテーブルにINSERTする Do While reader.Read '全フィールドの値をパラメーターにセットする For index As Integer = 0 To params2.Count - 1 params2(index).Value = reader(index) Next 'INSERT文を発行する cmd2.ExecuteNonQuery() Loop End Using End Using ```