私のSqlBulkCopyが機能しない理由

asp.net c# sqlbulkcopy sql-server-2005

質問

私はSqlBulkCopyオブジェクトを使用してSQL Serverテーブルにデータテーブルを書き出しています。ただし、データベースを再チェックするたびに、変更はそのまま残ります。 A

私は私の問題を決定するためにGoogleの検索をしようとしましたが、私はそれを解決することができません。

データテーブルは.xlsファイルから作成されました。

public static DataTable dt = new DataTable();

private void ExportToGrid(String path, String filen)
    {
        int idx = filen.IndexOf(".");
        string tf = filen.Remove(idx, 4);

        OleDbConnection MyConnection = null;
        DataSet DtSet = null;
        OleDbDataAdapter MyCommand = null;
        MyConnection = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; Data Source='" + path + "';Extended Properties=Excel 8.0;");

        ArrayList TblName = new ArrayList();

        MyConnection.Open();
        DataTable schemaTable = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
        foreach (DataRow row in schemaTable.Rows)
        {
            TblName.Add(row["TABLE_NAME"]);
        }

        MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [" + TblName[0].ToString() + "]", MyConnection);
        DtSet = new System.Data.DataSet();

        MyCommand.Fill(DtSet);
        MyCommand.FillSchema(DtSet, SchemaType.Source);

        DataTable dt = new DataTable();
        dt = DtSet.Tables[0];
        Session["dt"] = dt;
        int x = dt.Rows.Count;
        MyConnection.Close();

        if (dt.Rows.Count > 0)
        {
            theGridView.DataSource = dt;
            theGridView.DataBind();
        }

        if (System.IO.File.Exists(path))
        {
            System.IO.File.Delete(path);
        }

    }

これは私のライター機能です

private void StartImport()
    {
        string servername = server;
        string database = database;
        string tbl = "dbo.LinkDb";

        Stopwatch sw = new Stopwatch();
        sw.Start();
        SqlBulkCopy bulkCopy = new SqlBulkCopy("Data Source=" + servername + ";Initial Catalog=" + database + ";Integrated Security=SSPI", SqlBulkCopyOptions.TableLock);
        bulkCopy.DestinationTableName = tbl;
        bulkCopy.WriteToServer(dt);
        sw.Stop();
        lblResult.Visible = true;
        lblResult.Text = (sw.ElapsedMilliseconds / 1000.00).ToString();
    }

以下は、私のSQL Serverに格納されているテーブルのスクリーンショットです。大文字と小文字を区別するルールに従っていることを保証します。

テーブル

例外がスローされず、平均経過時間は0.018 - 0.020秒です

何か助けに感謝します。

ありがとうございました

受け入れられた回答

投稿したコードに基づいて、空のデータテーブルをデータベースに書き込んでいます。 "ExportToGrid"メソッドは、ローカルで宣言されたDataTable dtを埋め込み、メソッド外のスコープを失います。あなたの書き込み関数は、新しいデータテーブルである静的DataTable dtを呼び出しています。

dtは静的である必要がありますか?まるでこれが

private DataTable dt;

別のDataTableを宣言するのではなく、 "ExportToGrid"の内部で、すでに宣言されているdtをインスタンス化するだけで、新しいものを宣言するのではなく

dt = new DataTable();

また、writeメソッド中にGridViewから直接DataTableを抽出することもできます。

DataTable dt = (DataTable)theGridView.DataSource;
bulkCopy.WriteToServer(dt);

これにより、メソッドの範囲外の変数が不要になります。

最後にセッション内にデータテーブルを格納しているので(セッション変数に大量のデータを格納することを支持しているわけではありませんが、サイトの仕様を知らずに判断できません)、以下を使用できます:

DataTable dt = (DataTable)Session["dt"];
bulkCopy.WriteToServer(dt);

人気のある回答

私は明示的にデータテーブルからデータベーステーブルに列をマップするという事実を除いて、私の使用に比べて明らかなことはありません。

Using cn As New SqlConnection(DataAccessResource.CONNECTIONSTRING)
    cn.Open()
    Using copy As New SqlBulkCopy(cn)
        copy.BulkCopyTimeout = 300
        copy.ColumnMappings.Add(0, 0)
        copy.ColumnMappings.Add(1, 1)
        copy.ColumnMappings.Add(2, 2)
        copy.ColumnMappings.Add(3, 3)
        copy.DestinationTableName = "Tablename"
        copy.WriteToServer(dataset.datatable)
    End Using
End Using

接続文字列(SQL Server 2000!)のように見える

"data source=DBSERVERNAME;initial catalog=DBNAME;persist security info=True;user id=USERNAME;password=PASSWORD;packet size=4096"

私は、あなたが他の場所でそれを使用したと仮定して、接続文字列が問題であるとは思わない。

最後に、データセットのデータテーブルの列のデータ型がデータベースのデータ型と一致していることを確認しました。私の経験では、エクセルからのoledbのロードは、あなたが期待するかもしれない出力を生成するとは限りません。テキストと数字の混在した日付フィールドと列はperticular問題です。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ