Mengapa SqlBulkCopy Saya Tidak Berfungsi

Saya menggunakan objek SqlBulkCopy untuk menulis datatable ke dalam tabel server sql. Namun, setiap kali saya memeriksa ulang database saya, database saya tetap utuh dan tidak ada perubahan. A

Saya telah mencoba melakukan pencarian Google untuk menentukan masalah saya tetapi saya tidak dapat menyelesaikannya.

Datatable berasal dari file .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);
        }

    }

Ini adalah fungsi penulis saya

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();
    }

Di bawah ini adalah tangkapan layar tabel yang disimpan di server sql saya. Saya yakinkan Anda bahwa saya telah mematuhi aturan Peka Huruf Besar-kecil.

Tabel

Tidak ada pengecualian yang dilempar dan waktu rata-rata yang berlalu adalah 0,018 - 0,020 detik

Hargai bantuan apa pun.

Terima kasih


person rofans91    schedule 08.02.2012    source sumber
comment
Berapa banyak baris yang dimiliki dt pada saat Anda menelepon WriteToServer? apakah kolomnya cocok? (namun, yang terakhir harus terwujud dalam pengecualian daripada tidak melakukan apa pun)   -  person Marc Gravell    schedule 08.02.2012
comment
Saya pikir kolomnya cocok. Ada tambahan satu baris di dt. Saya juga bingung mengapa itu tidak berfungsi namun tidak ada pengecualian....   -  person rofans91    schedule 08.02.2012


Jawaban (2)


Berdasarkan kode yang Anda posting, Anda menulis datatable kosong ke database. Metode "ExportToGrid" Anda mengisi dt, DataTable yang dideklarasikan secara lokal, yang kehilangan cakupan di luar metode tersebut. Fungsi tulis Anda memanggil DataTable dt statis yang merupakan datatable baru.

Apakah dt harus statis? sepertinya ini bisa dinyatakan sebagai

private DataTable dt;

lalu di dalam "ExportToGrid" alih-alih mendeklarasikan DataTable lain, cukup buat instance dt yang sudah dideklarasikan daripada mendeklarasikan yang baru

dt = new DataTable();

Alternatifnya, Anda dapat mengekstrak DataTable langsung dari GridView selama Metode penulisan:

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

Hal ini menghilangkan kebutuhan akan variabel di luar cakupan metode.

Terakhir karena Anda menyimpan datatable Anda dalam sesi (saya biasanya tidak menganjurkan menyimpan sejumlah besar data dalam variabel sesi tetapi tanpa mengetahui secara spesifik situs Anda, saya tidak dapat memberikan penilaian), Anda dapat menggunakan yang berikut ini:

DataTable dt = (DataTable)Session["dt"];
bulkCopy.WriteToServer(dt);
person GarethD    schedule 08.02.2012

Saya tidak melihat sesuatu yang jelas dibandingkan dengan penggunaan saya kecuali fakta bahwa saya secara eksplisit memetakan kolom dari tabel data ke tabel database.

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

String koneksi (sql server 2000!) terlihat seperti ini

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

Saya ragu string koneksi merupakan masalah dengan asumsi Anda telah menggunakannya di tempat lain.

Terakhir, sudahkah Anda memeriksa tipe data untuk kolom-kolom dalam tabel data kumpulan data yang cocok dengan yang ada di database. Menurut pengalaman saya, pemuatan oledb dari excel tidak selalu menghasilkan keluaran yang Anda harapkan, bidang tanggal dan kolom dengan teks dan angka campuran menjadi masalah tertentu.

person Piperage    schedule 08.02.2012