SqlBulkCopy无法访问表

本文关键字:访问表 SqlBulkCopy | 更新日期: 2023-09-27 18:20:27

在读取excel表(到transferTable)后,我想使用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);
    }
}

SqlBulkCopy无法访问表

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

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

其中schema是目标模式,tableName是目标表名

从文件

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

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

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

正如Jhilden在MSDN论坛上回答的那样。

我最近遇到了同样的错误,在谷歌上搜索答案时发现了这篇文章。通过向执行大容量复制命令的用户提供插入和选择目标表的权限,我解决了这个问题。最初,我只向用户授予了插入权限,结果出现了"无法访问目标表"错误。

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

我在陈述时遇到了同样的问题

找不到tablename对象或权限不足。

它在我的账户上运行得很好,但在最终用户账户上却没有,因为它给出了这个错误。事实证明,如果您使用SqlBulkCopyOptions.KeepIdentity作为选项运行bulkcopy,连接用户需要Grant Alter权限,如果他不这样做,您将收到这条帮助不大的错误消息。

选项之一:

  • 从目标表中删除标识
  • 授予该用户对目标表的Alter权限
  • 不使用KeepIdentity

(这是Fosna答案的延伸,但考虑到我花了很多时间来确定根本原因,我认为应该让这个解决方案更明确一点)。

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

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

Andrij Ferents的答案有效。

在调用SQLBulkCopy之前,目标表必须存在。这是新手常犯的错误。

在我的例子中,这不是权限问题,而是表名问题中的一个特殊字符(括号和&)。

希望这能帮助

在我的案例中,问题是由于现有的Identity列