素人ですみません。(質問を2人の意見を聞いて再編集しました。)
素人なので変な風に理解してるかもしれません!よろしくお願いします。
ローカルにあるmdfファイルのテーブルごと
違うPCのSQLserverのテーブルに追加したいです。。
↓例 追加したいmdfファイルのデータ
A_field B_field C_field D_field LCno1 名前1 電話1 メール1 LCno2 名前2 電話2 メール2 LCno3 名前3 電話3 メール3
↓SQLserverのテーブル 追加後こうなってほしい (0_fieldは自動採番(オートナンバー)field)
0_field A_field B_field C_field D_field All_No1 LCno1 名前1 電話1 メール1 All_No2 LCno2 名前2 電話2 メール2 All_No3 LCno3 名前3 電話3 メール3
この様に共有サーバーに更新したいのですが…
2つ浮かびましたが…
・1のパターン SQL文で一括
・2のパターン insert文をC#で書いて一行つつでなら… (LINQも使える??)
2のパターンは何回もinsertするのでサーバーに負担かかりませんか?
今回は1のパターンを思考しています。。
↓ 1のパターンで考えた場合 (ごめんなさい2のパターンまで頭が回ってません。。。)
SQL接続文字 = @"Data Source=…" INSERT文 ="INSERT INTO SQLserverのテーブル 名 (A_field,B_field,C_field,D_field) SELECT * FROM [mdfデータベース名].テーブル名 WHERE 条件のあるフィールド = 何らか条件"
★問題点★ **[mdfデータベース名]**この部分 ↓ ①**[mdfデータベース名]**visual studioで追加してるから、mdfファイル名(サーバー名でだけいい?) →やってみたが駄目だった。(.mdfまで書く?) ②**[フルパス + mdfデータベース名]**(.mdfまで書く?) →ちょっと、やってみたがうまく行かず… ③プロバイダみたいなものが必要? →**[Provider=]**or**[Driver=]**???mdf用の書き方がいまいち分からない そもそもこのやり方でうまく行かないのか…
↓つくったINERT文をこれで
SQL接続.ExecuteNonQuery(INSERT文, SQL接続文字);
↓SQL接続クラス
public class SQL接続 { public static void ExecuteNonQuery(string sql, string 接続文字列) { using (SqlCommand command = new SqlCommand()) { SqlConnection conn = new SqlConnection(); conn.ConnectionString = conn.ConnectionString = 接続文字列; // トランザクションを開始します。 conn.Open(); SqlTransaction transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted); try { command.CommandText = sql; command.Connection = conn; command.Transaction = transaction; command.ExecuteNonQuery(); //トランザクションをコミットします。 transaction.Commit(); } catch (System.Exception) { //トランザクションをロールバックします。 transaction.Rollback(); throw; ← ここでエラーになってる } finally { conn.Close(); } } }
tamotoさんのをコメントをみて ↑あきらめて…
1/17追記 新解決策 SqlBulkCopy あと一歩で解決か!?汗。。
public static void ExecuteCopy(string tableName) { using (var mdfcn = new SqlConnection(mdf接続文字列)) using (var SQLcn = new SqlConnection(SQLserver接続文字)) { mdfcn.Open(); SQLcn.Open(); var mdfsql = string.Format("SELECT * FROM [{0}]", tableName); var mdfcmd = new SqlCommand(mdfsql, mdfcn); using (var rd = mdfcmd.ExecuteReader()) { using (var bulk = new SqlBulkCopy(SQLcn)) { bulk.BulkCopyTimeout = 10000; bulk.DestinationTableName = string.Format("dbo.{0}",tableName); bulk.WriteToServer(rd); //← ここでエラー ロケールIDが //追加情報:ソース列 'フィルード名' のロケール ID '1033' と //ターゲット列 'フィルード名' のロケール ID '1041' は //一致していません。 } } }
あと一歩なのかロケールIDが一致しないといわれる。
このやり方でSQLserver側の0fieldが mdf側になくても行けるのかがいまいち分かりませんが
ただ '1033'→英語 '1041'→日本語を指定出来るのかな… ?? またググってる最中です。
###2017/02/06追記 修正箇所
using (DataTable datatable = new DataTable())// 2017/02/06追記 {// 2017/02/06追記 datatable.Load(rd);// 2017/02/06追記 using (var bulk = new SqlBulkCopy(SQLcn)) { bulk.BulkCopyTimeout = 10000; bulk.DestinationTableName = string.Format("dbo.{0}",tableName); bulk.WriteToServer(datatable); //2017/02/06 書換 } }// 2017/02/06追記
tomatoさんのアドバイスで完璧にクリアできました。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/12 11:17
2017/01/12 16:46
2017/01/13 06:56
2017/01/13 10:01 編集
2017/01/16 06:08