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);
}
}
私の問題は少し異なっていました。私のテーブル名はSQLで予約されたキーワードだったので、次のことをしなければなりませんでした。
bulkCopy.DestinationTableName = $"{schema}.[{tableName}]";
ここで、schema
はターゲットスキーマであり、tableName
はターゲットテーブル名です。
ドキュメント から
DestinationTableNameは、3つの部分からなる名前[データベース]。[owningschema]。[名前]です。必要に応じて、テーブル名をそのデータベースと所有スキーマで修飾できます。ただし、テーブル名でアンダースコア( "_")またはその他の特殊文字を使用する場合は、([database]。[owningschema]。[name_01])のように、角かっこを使用して名前をエスケープする必要があります。
Dbに接続するユーザーが持っていることを確認してください
GRANT ALTER ON [dbo].[TABLE_XXX] TO [appuser]
MSDNフォーラム のJhildenによる回答で提案されているように。
このコードを実行するユーザーは、データベースに適切にアクセスできないようです。 *ユーザーがアクセスできるように確認してください。 *データベースへの接続に使用している接続文字列を確認してください。
私は最近、これと同じエラーに遭遇し、答えを探しているときにこの投稿に出くわしました。一括コピーコマンドを実行しているユーザーに、宛先テーブルに対する挿入と選択のアクセス許可を与えることで、問題を解決することができました。元々、ユーザーに挿入権限を付与しただけで、「宛先テーブルにアクセスできません」というエラーが発生しました。
興味深いことに、これは、純粋に数値のテーブル名がある場合にも発生します。テーブル名を1つ以上の英字で開始すると、問題なく機能します。
私は同じ問題を抱えていました
tablename-オブジェクトが見つからないか、特権が不十分です。
私のアカウントでは正常に機能しましたが、このエラーが発生したエンドユーザーアカウントでは機能しませんでした。オプションとしてSqlBulkCopyOptions.KeepIdentity
を指定してバルクコピーを実行する場合、接続ユーザーにはGrant Alter権限が必要であることが判明しました。そうでない場合、このあまり役に立たないエラーメッセージが表示されます。
1つが持っているオプション:
(これは Fosnaの答え の拡張ですが、根本原因を特定するのに時間がかかったことを考えると、このソリューションをもう少し明確にする価値があると思いました)。
私の場合、これは権限の問題ではなく、テーブル名の問題の特殊文字(括弧と&)です。
お役に立てれば
Bulkcopyは、テーブルがデータベースに存在することを想定しています。また、このデータベースまたはテーブルにアクセスできる必要があります。
Andrij Ferentsの回答 は有効です。
SQLBulkCopy
を呼び出す前に、宛先テーブルが存在している必要があります。これは一般的な初心者の間違いです。
私の場合、問題は既存のID列が原因でした