问题 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);
    }
}

10428
2018-01-17 11:47


起源

您应该添加更多相关标签,例如 c# 和数据库,例如 sql-server, ms-access  - sql 是一个通用的标签和 access 几乎毫无意义。 - Fionnuala


答案:


检查连接到db的用户是否有

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

正如Jhilden在回答中所建议的那样 MSDN论坛


5
2017-11-20 13:49



这并没有解决我的问题。即使用户是数据库所有者,我仍然无法访问表 - user3183411


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

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

哪里 schema 是目标架构和 tableName 目标表名称

来自 文件

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


5
2018-06-21 13:58



是的,这对我来说也是个问题。来自msdn:DestinationTableName是一个由三部分组成的名称(<database>。<owningschema>。<name>)。如果您愿意,可以使用其数据库和拥有模式限定表名。 但是,如果表名使用下划线(“_”)或任何其他特殊字符,则必须使用左括号来转义名称 如([<database>。<owningschema>。<name_01>])。 - bluedot
谢谢@bluedot我已经用你的评论细节更新了我的答案 - Tjaart van der Walt


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


2
2018-01-17 22:13



我的connectionstring是:string connectionString = @“Data Source =。\ SQLEXPRESS; AttachDbFilename = | DataDirectory | \ TestDB.mdf; User Instance = True; Integrated Security = True;”; - SND


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


2
2018-02-14 20:31





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


1
2017-08-09 06:02





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

希望这可以帮助


0
2017-09-21 11:53





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


-1
2017-12-07 12:13