Почему мой SqlBulkCopy не работает - PullRequest
1 голос
/ 08 февраля 2012

Я использую объект SqlBulkCopy для записи данных в таблицу сервера SQL.Однако каждый раз, когда я перепроверяю свою базу данных, она остается без изменений.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.Уверяю вас, что я соблюдаю правила с учетом регистра.

Tables

Не было сгенерировано исключение, и среднее время в пути составляет 0,018 - 0,020 с

Цените любыепомогает.

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Основываясь на опубликованном вами коде, вы записываете пустую таблицу данных в базу данных.Ваш метод «ExportToGrid» заполняет dt, DataTable, объявленный локально, который теряет область за пределами метода.Ваша функция записи вызывает статический DataTable dt, который является новым датабельным.

Должен ли dt быть статическим?кажется, что это может быть объявлено как

private DataTable dt;

, а затем внутри «ExportToGrid» вместо того, чтобы объявлять другой DataTable, просто создать экземпляр уже объявленного dt, а не объявить новый

dt = new DataTable();

В качестве альтернативыВы можете извлечь DataTable прямо из GridView во время метода записи:

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

Это устраняет необходимость в переменных вне области метода.

Наконец, поскольку вы храните свои данные в сеансе (я обычно не сторонник хранения больших объемов данных в переменных сеанса, но, не зная специфику вашего сайта, я не могу на самом деле судить), вы можете использоватьследующее:

DataTable dt = (DataTable)Session["dt"];
bulkCopy.WriteToServer(dt);
0 голосов
/ 08 февраля 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 не всегда дает результат, который вы ожидаете, поля даты и столбцы со смешанным текстом и числами являются проблемами с чересчур.

...