web-dev-qa-db-ja.com

SqlBulkCopyはテーブルにアクセスできません

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);
    }
}
16
SND

私の問題は少し異なっていました。私のテーブル名はSQLで予約されたキーワードだったので、次のことをしなければなりませんでした。

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

ここで、schemaはターゲットスキーマであり、tableNameはターゲットテーブル名です。

ドキュメント から

DestinationTableNameは、3つの部分からなる名前[データベース]。[owningschema]。[名前]です。必要に応じて、テーブル名をそのデータベースと所有スキーマで修飾できます。ただし、テーブル名でアンダースコア( "_")またはその他の特殊文字を使用する場合は、([database]。[owningschema]。[name_01])のように、角かっこを使用して名前をエスケープする必要があります。

14

Dbに接続するユーザーが持っていることを確認してください

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

MSDNフォーラム のJhildenによる回答で提案されているように。

5
Fosna

このコードを実行するユーザーは、データベースに適切にアクセスできないようです。 *ユーザーがアクセスできるように確認してください。 *データベースへの接続に使用している接続文字列を確認してください。

2
Carl Bergquist

私は最近、これと同じエラーに遭遇し、答えを探しているときにこの投稿に出くわしました。一括コピーコマンドを実行しているユーザーに、宛先テーブルに対する挿入と選択のアクセス許可を与えることで、問題を解決することができました。元々、ユーザーに挿入権限を付与しただけで、「宛先テーブルにアクセスできません」というエラーが発生しました。

2
user132936

興味深いことに、これは、純粋に数値のテーブル名がある場合にも発生します。テーブル名を1つ以上の英字で開始すると、問題なく機能します。

1
Nick Brown

私は同じ問題を抱えていました

tablename-オブジェクトが見つからないか、特権が不十分です。

私のアカウントでは正常に機能しましたが、このエラーが発生したエンドユーザーアカウントでは機能しませんでした。オプションとしてSqlBulkCopyOptions.KeepIdentityを指定してバルクコピーを実行する場合、接続ユーザーにはGrant Alter権限が必要であることが判明しました。そうでない場合、このあまり役に立たないエラーメッセージが表示されます。

1つが持っているオプション:

  • 宛先テーブルからIDを削除します
  • そのユーザーの宛先テーブルに対する変更権を付与する
  • keepIdentityを使用しない

(これは Fosnaの答え の拡張ですが、根本原因を特定するのに時間がかかったことを考えると、このソリューションをもう少し明確にする価値があると思いました)。

1
Jan

私の場合、これは権限の問題ではなく、テーブル名の問題の特殊文字(括弧と&)です。

お役に立てれば

0

Bulkcopyは、テーブルがデータベースに存在することを想定しています。また、このデータベースまたはテーブルにアクセスできる必要があります。

0
Andrij Ferents

Andrij Ferentsの回答 は有効です。

SQLBulkCopyを呼び出す前に、宛先テーブルが存在している必要があります。これは一般的な初心者の間違いです。

0
MarkF

私の場合、問題は既存のID列が原因でした

0
Majid