SqlBulkCopy无法访问表

时间:2012-01-17 11:47:43

标签: c# sql-server database sqlbulkcopy

在读取excel-sheet(到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);
    }
}

10 个答案:

答案 0 :(得分:12)

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

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

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

来自documentation

  

DestinationTableName是一个由三部分组成的名称[数据库]。[owningschema]。[name]。如果选择,您可以使用其数据库和拥有模式限定表名。但是,如果表名使用下划线(&#34; _&#34;)或任何其他特殊字符,则必须使用周围的括号来转义名称,如([database]。[owningschema]。[name_01])

答案 1 :(得分:5)

检查连接到db的用户是否

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

根据Jhilden在MSDN forum的回答中提出的建议。

答案 2 :(得分:2)

执行此代码的用户似乎没有对数据库的适当访问权限。  *检查以便用户可以访问。  *检查用于连接数据库的连接字符串。

答案 3 :(得分:2)

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

答案 4 :(得分:2)

我也有同样的问题

找不到

tablename-object或特权不足。

它在我的帐户上运行正常,但在最终用户帐户上却无法正常工作,导致出现此错误。原来,如果您使用SqlBulkCopyOptions.KeepIdentity作为选项运行bulkcopy,则连接用户需要授予Grant Alter权限,如果没有,则您将得到此不是很有帮助的错误消息。

一个选项具有:

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

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

答案 5 :(得分:1)

有趣的是,如果您的表名纯粹是数字,也会发生这种情况。使用一个或多个字母字符启动表名称,它可以正常工作。

答案 6 :(得分:0)

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

希望这有帮助

答案 7 :(得分:0)

Andrij Ferents answer有效。

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

答案 8 :(得分:0)

就我而言,问题是由于存在“身份”列

答案 9 :(得分:-1)

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