เหตุใด SqlBulkCopy ของฉันจึงไม่ทำงาน

ฉันใช้วัตถุ SqlBulkCopy เพื่อเขียน DataTable ลงในตารางเซิร์ฟเวอร์ SQL อย่างไรก็ตาม ทุกครั้งที่ฉันตรวจสอบฐานข้อมูลของฉันอีกครั้ง ฐานข้อมูลจะยังคงไม่เสียหายโดยไม่มีการเปลี่ยนแปลง ก

ฉันได้ลองค้นหาโดย Google เพื่อระบุปัญหาของฉันแล้ว แต่ไม่สามารถแก้ไขได้

DataTable มาจากไฟล์ .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 ของฉัน ฉันรับรองกับคุณว่าฉันได้ปฏิบัติตามกฎที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

ตาราง

ไม่มีข้อยกเว้นเกิดขึ้น และเวลาที่ผ่านไปโดยเฉลี่ยคือ 0.018 - 0.020 วินาที

ขอบคุณสำหรับความช่วยเหลือใด ๆ

ขอบคุณ


person rofans91    schedule 08.02.2012    source แหล่งที่มา
comment
dt มีกี่แถวในเวลาที่คุณเรียก WriteToServer? คอลัมน์ตรงกันไหม? (อย่างหลังควรแสดงออกมาเป็นข้อยกเว้น แทนที่จะไม่ทำอะไรเลย)   -  person Marc Gravell    schedule 08.02.2012
comment
ฉันคิดว่าคอลัมน์ตรงกัน มีอีกหนึ่งแถวใน dt ฉันก็งงเช่นกันว่าทำไมมันถึงใช้งานไม่ได้ แต่ก็ไม่มีข้อยกเว้นใด ๆ ....   -  person rofans91    schedule 08.02.2012


คำตอบ (2)


จากโค้ดที่คุณโพสต์ คุณกำลังเขียน DataTable เปล่าลงในฐานข้อมูล เมธอด "ExportToGrid" ของคุณเติม dt ซึ่งเป็น DataTable ที่ประกาศในเครื่อง ซึ่งสูญเสียขอบเขตภายนอกเมธอด ฟังก์ชันการเขียนของคุณกำลังเรียก DataTable dt แบบคงที่ซึ่งเป็น DataTable ใหม่

dt จำเป็นต้องคงที่หรือไม่? ดูเหมือนว่าสิ่งนี้สามารถประกาศได้ว่าเป็น

private DataTable dt;

จากนั้นภายใน "ExportToGrid" แทนที่จะประกาศ DataTable อื่น เพียงแค่สร้างอินสแตนซ์ dt ที่ประกาศไว้แล้วแทนที่จะประกาศอันใหม่

dt = new DataTable();

หรือคุณสามารถแยก DataTable โดยตรงจาก GridView ในระหว่างวิธีการเขียน:

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

สิ่งนี้จะขจัดความจำเป็นในการใช้ตัวแปรที่อยู่นอกขอบเขตของวิธีการ

สุดท้ายนี้ เนื่องจากคุณจัดเก็บ DataTable ของคุณภายในเซสชัน (โดยทั่วไปฉันไม่ใช่ผู้สนับสนุนการจัดเก็บข้อมูลจำนวนมากในตัวแปรเซสชัน แต่เมื่อไม่ทราบข้อมูลเฉพาะของไซต์ของคุณ ฉันไม่สามารถผ่านการตัดสินได้) คุณสามารถใช้สิ่งต่อไปนี้:

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

ฉันไม่เห็นสิ่งใดที่ชัดเจนเมื่อเทียบกับการใช้งานของฉัน ยกเว้นความจริงที่ว่าฉันแมปคอลัมน์จากตารางข้อมูลไปยังตารางฐานข้อมูลอย่างชัดเจน

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 จาก Excel ไม่ได้สร้างผลลัพธ์ที่คุณอาจคาดหวังเสมอไป เขตข้อมูลและคอลัมน์วันที่ที่มีข้อความผสมและตัวเลขเป็นปัญหาแบบ Perticular

person Piperage    schedule 08.02.2012