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
В моем случае проблема была из-за существующего столбца идентификации