SqlBulkCopy 无法访问表

问题描述 投票:0回答:11

读入 Excel 工作表(传输表)后,我想使用 SqlBulkCopy 将该数据添加到新表(destinationTable),但出现错误:

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);
    }
}
c# sql-server database sqlbulkcopy
11个回答
16
投票

我的问题有点不同,结果我的表名是 SQL 中的保留关键字,所以我必须执行以下操作:

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

其中

schema
是目标架构,
tableName
是目标表名称

来自文档

DestinationTableName 是一个由三部分组成的名称 [database].[owningschema].[name]。如果您选择,可以使用其数据库和所属架构来限定表名称。但是,如果表名称使用下划线(“_”)或任何其他特殊字符,则必须使用括号对名称进行转义,如 ([database].[owningschema].[name_01])


6
投票

检查连接到数据库的用户是否有

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

正如 Jhilden 在 MSDN 论坛上的回答所建议的。


5
投票

我最近遇到了同样的错误,并在谷歌搜索答案时发现了这篇文章。 我能够通过向正在执行大容量复制命令的用户授予对目标表的插入和选择权限来解决该问题。 最初我只向用户授予插入权限,并收到“无法访问目标表”错误。


2
投票

执行此代码的用户似乎没有正确访问数据库的权限。 * 检查以便用户获得访问权限。 * 检查您用于连接数据库的连接字符串。


2
投票

我也遇到了同样的问题

未找到表名对象或权限不足。

它在我的帐户上运行良好,但在最终用户帐户上运行不佳,并出现此错误。事实证明,如果您使用

SqlBulkCopyOptions.KeepIdentity
作为选项运行批量复制,连接用户需要授予更改权限,如果他没有,您将收到此不太有用的错误消息。

选项有:

  • 从目标表中删除身份
  • 授予该用户对目标表的更改权限
  • 不使用KeepIdentity

(这是 Fosna 答案的扩展,但考虑到我花了时间来确定根本原因,我认为可能值得让这个解决方案更明确一点)。


1
投票

Bulkcopy 期望该表存在于数据库中。您还应该有权访问此数据库或表。


1
投票

有趣的是,如果您有一个纯数字的表名,也会发生这种情况。以一个或多个字母字符开头的表名称,效果很好。


1
投票

Andrij Ferents 的回答 有效。

在调用

SQLBulkCopy
之前目标表必须存在。这是新手常见的错误。


0
投票

就我而言,这不是权限问题,而是表名中的特殊字符问题(括号和 & )。

希望这有帮助


0
投票

就我而言,问题是由于现有的 Identity 列


0
投票

我通过将临时表更改为 #TmpTable 解决了此错误,一旦我更改了 DestinationTableName 中的名称,它就起作用了!!

bulkcopy.DestinationTableName = "#TmpTable";

之前我将临时表设置为“#TmpTableUpd”

© www.soinside.com 2019 - 2024. All rights reserved.