2012-01-17 2 views
11

Dopo aver letto in un excel fogli (a transferTable), voglio aggiungere che i dati in una nuova tabella (destinationTable) utilizzando SqlBulkCopy, ma sto ottenendo l'errore:SqlBulkCopy non può accedere alla tabella

Cannot access destination table 'test' 

Ho provato a utilizzare il nome di tabulazione predefinito e l'utilizzo di parentesi quadre, ma non ha funzionato.

Qualche suggerimento?

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

Si dovrebbe aggiungere tag più rilevanti, come ad esempio 'C#' e un database, ad esempio 'sql-server',' MS-access' - 'mq l' è un tag generico e 'access' è quasi privo di significato. – Fionnuala

risposta

5

Verificare che l'utente che si collega al db ha

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

come suggerito in risposta da Jhilden su MSDN forum.

+0

Questo non ha risolto il mio problema. Non riesco ancora ad accedere alle tabelle anche se l'utente è proprietario del database – user3183411

2

Sembra che l'utente che esegue questo codice non disponga di un accesso corretto al database. * Verifica in modo che l'utente abbia accesso. * Controllare la connessione che si utilizza per connettersi al database.

+0

La mia stringa di connessione è: string connectionString = @ "Origine dati =. \ SQLEXPRESS; AttachDbFilename = | DataDirectory | \ TestDB.mdf; Istanza utente = True; Sicurezza integrata = True;"; – SND

2

Recentemente mi sono imbattuto in questo stesso errore e ho trovato questo post mentre cercavo su google per una risposta. Sono stato in grado di risolvere il problema dando all'utente che sta eseguendo l'inserimento del comando di copia bulk e selezionare le autorizzazioni sulla tabella di destinazione. Inizialmente avevo concesso solo l'autorizzazione all'inserimento all'utente e ho ricevuto l'errore "Impossibile accedere alla tabella di destinazione".

0

Nel mio caso, non si tratta di un problema di autorizzazione, ma di un carattere speciale nel problema del nome di tabella (parentesi e &).

Spero che questo aiuti

0

bulkcopy aspetta il tavolo per esiste nel database. Dovresti anche avere accesso a questo database o tabella.

1

È interessante notare che ciò si verifica anche se il nome di una tabella è puramente numerico. Avvia il nome della tabella con uno o più caratteri alfabetici e funziona perfettamente.

4

Il mio problema era un po 'diverso, si rivela il mio nome della tabella era una parola chiave riservata in SQL così ho dovuto fare quanto segue:

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

Dove schema è lo schema di destinazione e tableName il nome della tabella di destinazione

Dal documentation

DestinationTableName is a three-part name [database].[owningschema].[name]. You can qualify the table name with its database and owning schema if you choose. However, if the table name uses an underscore ("_") or any other special characters, you must escape the name using surrounding brackets as in ([database].[owningschema].[name_01])

+0

Sì, anche questo era il problema. da MSDN: DestinationTableName è un nome in tre parti (..). Se si sceglie, è possibile qualificare il nome della tabella con il proprio database e lo schema proprietario.** Tuttavia, se il nome della tabella utilizza un carattere di sottolineatura ("_") o qualsiasi altro carattere speciale, è necessario sfuggire al nome utilizzando le parentesi quadre ** come in [[. . ]). – bluedot

+0

grazie @bluedot Ho aggiornato la mia risposta con i dettagli del commento –