SqlBulkCopy не может получить доступ к таблице

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

Cannot access destination table 'test'

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

Любые предложения?

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

Ответ 1

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

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

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

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

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

Ответ 2

Убедитесь, что пользователь, подключающийся к db, имеет

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

как было предложено в ответ Jhilden на форуме MSDN.

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

В моем случае это не проблема разрешения, а специальная char в проблеме имени таблицы (скобки и и).

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

В моем случае проблема была из-за существующего столбца идентификации