SqlBulkCopy ne peut pas accéder à la table

c# database sqlbulkcopy sql-server

Question

Après avoir lu dans une feuille Excel (à transferTable), je veux ajouter ces données à une nouvelle table (destinationTable) à l'aide de SqlBulkCopy, mais je reçois l'erreur

Cannot access destination table 'test'

J'ai essayé d'utiliser le nom de table par défaut et d'utiliser des crochets, mais cela n'a pas fonctionné.

Aucune suggestion?

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

Réponse acceptée

Vérifiez que l'utilisateur qui se connecte à la base de données a

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

comme suggéré dans la réponse de Jhilden sur le forum MSDN .


Réponse populaire

Mon problème était un peu différent, il s'avère que mon nom de table était un mot clé réservé dans SQL. Je devais donc procéder comme suit:

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

schema est le schéma cible et tableName le nom de la table cible

De la documentation

DestinationTableName est un nom en trois parties [base de données]. [Owningschema]. [Name]. Vous pouvez qualifier le nom de la table avec sa base de données et son schéma si vous le souhaitez. Toutefois, si le nom de la table utilise un trait de soulignement ("_") ou tout autre caractère spécial, vous devez le remplacer par des crochets, comme dans ([base de données]. [Owningschema]. [Nom_01]).



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi