【问题标题】:SqlBulkCopy cannot access tableSqlBulkCopy 无法访问表
【发布时间】:2012-02-12 05:22:50
【问题描述】:

在读取 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-serverms-access -- sql是一个通用标签,access几乎没有意义。

标签: c# sql-server database sqlbulkcopy


【解决方案1】:

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

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

其中schema 是目标架构,tableName 是目标表名

来自documentation

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

【讨论】:

  • 是的,这也是我的问题。来自 msdn:DestinationTableName 是一个由三部分组成的名称 (..)。如果您愿意,您可以使用其数据库和拥有模式来限定表名。 但是,如果表名使用下划线 ("_") 或任何其他特殊字符,则必须使用括弧 转义名称,如 ([.. ])。
  • 谢谢@bluedot 我已经用你的评论细节更新了我的答案
  • 我决定将接受的答案更改为这个答案,因为它更完整并参考了官方文档。此外,从赞成票来看,总的来说,它似乎比以前接受的答案更有帮助。
【解决方案2】:

检查连接到db的用户有

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

正如 Jhilden 在MSDN forum 上的回答所建议的那样。

【讨论】:

  • 这并没有解决我的问题。即使用户是数据库所有者,我仍然无法访问表
【解决方案3】:

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

【讨论】:

【解决方案4】:

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

【讨论】:

  • 我的连接字符串是:string connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\TestDB.mdf;User Instance=True;Integrated Security=True;";
【解决方案5】:

我有同样的问题说明

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

它在我的帐户上运行良好,但在最终用户帐户上却出现此错误。事实证明,如果您使用 SqlBulkCopyOptions.KeepIdentity 作为选项运行批量复制,则连接用户需要 Grant Alter 权限,如果他不这样做,您将收到这个不太有用的错误消息。

选项之一:

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

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        Andrij Ferents answer 有效。

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

        【讨论】:

          【解决方案9】:

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

          希望对你有帮助

          【讨论】:

            【解决方案10】:

            在我的情况下,问题是由于现有的身份列

            【讨论】:

              猜你喜欢
              • 2015-05-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-29
              相关资源
              最近更新 更多