none
CSVファイルの登録処理について RRS feed

  • 質問

  • いつも利用させていただいています。

    カンマ区切りのCSVファイルをSQLserverに新規登録または更新登録したいのです。

    こちらを参考に

    http://social.msdn.microsoft.com/forums/ja-JP/csharpgeneralja/thread/92cb03ae-ccab-47c1-bcc0-2dd1864e40ad/

    途中まで作成したのですが、DataRowCollection.Findで既にこの主キーを持つレコードが存在するか判断する方法がわかりません。

    どなたかご教授いただけないでしょうか?

    よろしくお願いします。

                SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings                         ["DataSourceConnectionString"].ConnectionString);
                con.Open();

    DataTable dt = new DataTable();

                //テーブル情報を取得
                SqlDataAdapter daAuthors = new SqlDataAdapter("SELECT * FROM " + Tablename, con);
                DataSet beforeds = new DataSet(Tablename);

                daAuthors.FillSchema(beforeds, SchemaType.Source, Tablename);
                //レコードを読み込み
                daAuthors.Fill(beforeds, Tablename);

               
                //DataTable のインスタンスを作成し、DataSet の Tables コレクションに追加する
                DataSet customers = new DataSet();
                DataTable customersTable = customers.Tables.Add(Tablename);
                //主キーを構成する列の配列を取得
                DataColumn[] columns = customersTable.PrimaryKey;
                //int i = 0;
                //既にこの主キーを持つレコードが存在するか判断(存在しなければINSERT、存在したらUPDATE)
                foreach (int i in columns.Count)
                {
                    if ( i < columns.Count)
                    {
                            //更新処理

                    }
                    else
                    {
                        //追加処理
                               ds.Tables(Tablename).Rows.Add(row.RowState)
                    }
                 }

     

    2012年1月25日 6:13

回答

  • SQL Server の、バージョンは何でしょうか。SQL Server 2008 からは、MERGE ステートメントがあるので、これを使うことで判定をする必要がなくなります→「MERGE ステートメント(UPSERT)」 また、「SQL Server OPENROWSET 関数の bulk オプションでテキストファイルを MERGE(UPSERT)処理」こちらの様な方法を検討されてはいかがでしょうか。

    (データの有無で INSERT/UPDATE を切り替える「upsert」という語を知っていたので、「sql server upsert」で検索)


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2012年1月31日 9:16
    • 回答としてマーク 山本春海 2012年2月23日 7:23
    2012年1月25日 12:35
  • BULKはやはりDBサーバ上にCSVファイルがないとダメなんですね。
    CSVファイルはDBサーバに置くことができないので何かほかの方法でないとダメみたいです。

    え?BULK はダメでも、MERGE は出来ますよね?

    おおっと、USING に指定するテーブルが必要…なのかな?MERGE (Transact-SQL)より。他のテーブルが必要なら、CSV ファイルを同じ構造のテーブルに一旦保存し、そのテーブルとマージする。そして、CSV ファイルを保存したテーブルは削除する、と言う順序で出来ますよね。かなり手間ですけど。

    CSV ファイルが外部に公開されているフォルダーにあって、適切にセキュリティの設定がされていれば、リモートにファイルがあっても大丈夫だと思います。BULK INSERT (Transact-SQL)には、「data_file には、SQL Server が実行されているサーバーからの有効なパスを指定する必要があります。data_file がリモート ファイルの場合は、UNC (汎用名前付け規則) 名を指定します。」と書かれています。(MSDN 内で「MERGE」を検索。その後、左のツリーに「BULK INSERT」を見つけた。)


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2012年2月2日 8:25
    • 回答としてマーク 山本春海 2012年2月23日 7:23
    2012年1月30日 12:10

すべての返信

  • SQL Server の、バージョンは何でしょうか。SQL Server 2008 からは、MERGE ステートメントがあるので、これを使うことで判定をする必要がなくなります→「MERGE ステートメント(UPSERT)」 また、「SQL Server OPENROWSET 関数の bulk オプションでテキストファイルを MERGE(UPSERT)処理」こちらの様な方法を検討されてはいかがでしょうか。

    (データの有無で INSERT/UPDATE を切り替える「upsert」という語を知っていたので、「sql server upsert」で検索)


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2012年1月31日 9:16
    • 回答としてマーク 山本春海 2012年2月23日 7:23
    2012年1月25日 12:35
  • 環境を書き忘れたにもかかわらず
    丁寧なご返答ありがとうございます。

    SQLServerは2008R2で、
    VisualStudio2010、MVCのフレームワークを使っています。

    フォーマットファイル作成できたので、MERGE INTOを試したのですが・・・

    BULKはやはりDBサーバ上にCSVファイルがないとダメなんですね。

    CSVファイルはDBサーバに置くことができないので何か

    ほかの方法でないとダメみたいです。

     



    2012年1月26日 0:40
  • BULKはやはりDBサーバ上にCSVファイルがないとダメなんですね。
    CSVファイルはDBサーバに置くことができないので何かほかの方法でないとダメみたいです。

    え?BULK はダメでも、MERGE は出来ますよね?

    おおっと、USING に指定するテーブルが必要…なのかな?MERGE (Transact-SQL)より。他のテーブルが必要なら、CSV ファイルを同じ構造のテーブルに一旦保存し、そのテーブルとマージする。そして、CSV ファイルを保存したテーブルは削除する、と言う順序で出来ますよね。かなり手間ですけど。

    CSV ファイルが外部に公開されているフォルダーにあって、適切にセキュリティの設定がされていれば、リモートにファイルがあっても大丈夫だと思います。BULK INSERT (Transact-SQL)には、「data_file には、SQL Server が実行されているサーバーからの有効なパスを指定する必要があります。data_file がリモート ファイルの場合は、UNC (汎用名前付け規則) 名を指定します。」と書かれています。(MSDN 内で「MERGE」を検索。その後、左のツリーに「BULK INSERT」を見つけた。)


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2012年2月2日 8:25
    • 回答としてマーク 山本春海 2012年2月23日 7:23
    2012年1月30日 12:10