2

私はc#を使用して.netでwebAppを構築しています。バックアップファイル(csvファイル)をアップロードするコードに問題があります。

これはコードです:

        protected void UploadBackup(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(dataset1.ConnStr);
        string filepath = ""+Server.MapPath("/backups/Species.csv");
        StreamReader sr = new StreamReader(filepath);
        string line = sr.ReadLine();
        string[] value = line.Split(',');
        DataTable dt = new DataTable();
        DataRow row;
        foreach (string dc in value)
        {
            dt.Columns.Add(new DataColumn(dc));
        }

        while (!sr.EndOfStream)
        {
            value = sr.ReadLine().Split(',');
            if (value.Length == dt.Columns.Count)
            {
                row = dt.NewRow();
                row.ItemArray = value;
                dt.Rows.Add(row);
            }
        }
        SqlBulkCopy bc = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.TableLock);
        bc.DestinationTableName = "Species";
        bc.BatchSize = dt.Rows.Count;
        con.Open();
        bc.WriteToServer(dt);
        bc.Close();
        con.Close();
    }

このコードは、ボタンをクリックしてデータベースに接続し、Speciesテーブルのすべての行を復元すると、正常に機能します。

これが私の問題です。このテーブルに値がある場合、主キーがすでに取得されているため、エラーが返されます。私がやりたいのは、いくつかの主キーがすでに取得されている場合、csvファイルからの新しい値でこの行を更新し、主キーが取得されていない場合は、元のコードと同じように動作します(行を追加するだけです) )、行がすでに存在するかどうかを確認するコードをどこに書く必要がありますか?

4

2 に答える 2

2

レコードを一時テーブルに挿入してから、merge sqlコマンドを発行して、データを既存のテーブルにマージします。

例については、http://www.jarloo.com/c-bulk-upsert-to-sql-server-tutorial/を参照してください。

于 2013-01-26T13:54:34.717 に答える
1

存在する場合と存在しない場合Stored Procedureにtoを作成することをお勧めします。このアプローチはではうまくいかないと思いますが、行を1つずつ挿入する必要があります。UpdateInsertSqlBulkCopy

于 2013-01-26T13:49:56.540 に答える