SqlBulkCopy не может получить доступ к таблице - PullRequest
14 голосов
/ 17 января 2012

После прочтения в Excel-листе (для TransferTable) я хочу добавить эти данные в новую таблицу (destinationTable) с помощью SqlBulkCopy, но получаю сообщение об ошибке:

Cannot access destination table 'test'

I 'мы пытались использовать имя таблицы по умолчанию и использовать квадратные скобки, но это не сработало.

Есть предложения?

private void writeToDBButton_Click(object sender, EventArgs e) {
    MakeTable();
    destinationTable.TableName = "test";
    testDBDataSet.Tables.Add("test");

    // Connects to the sql-server using Connection.cs
    SqlConnection connection = Connection.GetConnection();

    using (connection) {
        connection.Open();

        // Uses SqlBulkCopy to copy the data from our transferTable to the destinationTable
        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) {
            bulkCopy.DestinationTableName = destinationTable.TableName;

            try {
                // Write from the source to the destination.
                bulkCopy.WriteToServer(transferTable);
                this.dataGridView2.DataSource = destinationTable;
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }

            connection.Close();
        }
    }
}

private void saveDBButton_Click(object sender, EventArgs e) {
    this.Validate();
    this.usersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.testDBDataSet);
}


private void MakeTable() {
    for (int counter = 0; counter < columns; counter++) {
        DataColumn dummy = new DataColumn();
        dummy.DataType = System.Type.GetType("System.Double");
        destinationTable.Columns.Add(dummy);
    }
}

Ответы [ 8 ]

12 голосов
/ 21 июня 2017

Моя проблема была немного другой, оказалось, что имя моей таблицы было зарезервированным ключевым словом в SQL, поэтому мне пришлось сделать следующее:

bulkCopy.DestinationTableName = $"{schema}.[{tableName}]";

Где schema - целевая схема, а tableNameимя целевой таблицы

Из документации

DestinationTableName является трехкомпонентным именем [database]. [owningschema]. [name].При желании вы можете указать имя таблицы с ее базой данных и схемой-владельцем.Однако, если в имени таблицы используется подчеркивание ("_") или любые другие специальные символы, вы должны экранировать имя, используя окружающие скобки, как в ([база данных]. [Owningschema]. [Имя_01])

5 голосов
/ 20 ноября 2013

Убедитесь, что у пользователя, подключающегося к базе данных, есть

GRANT ALTER ON [dbo].[TABLE_XXX] TO [appuser] 

, как это было предложено Джилденом на форуме MSDN .

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

Я недавно столкнулся с этой же ошибкой и наткнулся на этот пост, пытаясь найти ответ.Мне удалось решить эту проблему, предоставив пользователю, выполняющему команду массового копирования, вставить и выбрать разрешения для таблицы назначения.Первоначально я предоставил пользователю только разрешение на вставку и получил ошибку «Не удается получить доступ к таблице назначения».

2 голосов
/ 18 января 2012

Кажется, что пользователь, который выполняет этот код, не имеет надлежащего доступа к базе данных. * Проверьте, чтобы пользователь получил доступ. * Проверьте строку подключения, которую вы используете для подключения к базе данных.

1 голос
/ 09 августа 2016

Интересно, что это также происходит, если у вас есть имя таблицы, которое является чисто числовым. Начинайте имя таблицы с одного или нескольких буквенных символов, и оно отлично работает.

0 голосов
/ 21 июня 2019

Андрей Ференц ответ действителен.

Таблица назначения должна существовать до вызова SQLBulkCopy. Это распространенная ошибка новичка.

0 голосов
/ 07 декабря 2015

Bulkcopy ожидает, что таблица существует в базе данных. Также у вас должен быть доступ к этой базе данных или таблице.

0 голосов
/ 21 сентября 2015

В моем случае это не проблема с правами доступа, а специальный символ в проблеме имени таблицы (скобки и &).

Надеюсь, это поможет

...