2016-11-24 3 views
2

Ich habe ein Problem mit SqlBulkCopy Befehl bei der Verwendung der SQL Server-Authentifizierung. Das Problem tritt bei der Windows-Authentifizierung nicht auf.SqlBulkCopy Anmeldung fehlgeschlagen

SqlBulkCopy sbc = new SqlBulkCopy(sqConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity); 

dies wirft einen Fehler:

Login failed for user 'xx'

Code:

SqlBulkCopy sbc = new SqlBulkCopy(sqConn); 

Dies funktioniert gut, aber nicht beibehalten Identitätsspalte ursprünglichen Werte zurück.

+0

Danke für die Änderungen Jungs. Ich werde daran denken, den Code das nächste Mal in Blöcke zu stecken. – davehay

Antwort

1

Die Lösung ist recht einfach, aber ich bin immer noch daran interessiert zu wissen, warum SQL Server-Authentifizierung von Windows-Authentifizierung anders sein sollte.

using (SqlTransaction transaction = 
       sqConn.BeginTransaction()) 
      { 

       SqlBulkCopy sbc = new SqlBulkCopy(sqConn,SqlBulkCopyOptions.KeepIdentity,transaction); 
       sbc.DestinationTableName = file; 
       sbc.BatchSize = 1000; 
       sbc.NotifyAfter = 1000; 
       sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied); 
       sbc.WriteToServer(SourceTable); 
       transaction.Commit(); 
      } 
+0

Was ist die Lösung dann? AFAICT Sie haben die Authentifizierung nicht geändert. – martennis

+1

Die Lösung besteht darin, eine Transaktion zu verwenden und dann mit der SQL Server-Authentifizierung zu arbeiten. Ich brauchte dies, um eine Massenkopie in Azure SQL-Tabellen zu erstellen, in denen die Azure AD-Authentifizierung nicht möglich war. – davehay

+0

'new SqlBulkCopy()' hat 4 Überladungen: 'SqlConnection' only,' SqlConnection/SqlBulkCopyOptions/SqlTransaction', 'string' only und' string/SqlBulkCopyOptions'. Wenn Sie die Kopieroption KeepIdentity bereitstellen möchten, müssen Sie etwas für die SqlTransaction angeben, andernfalls versucht der Compiler, eine Übereinstimmung mit der Überladung string/SqlBulkCopyOptions herzustellen. Soweit ich weiß, gibt es nichts, was Sie daran hindert, einfach ein Null-Objekt für die SqlTransaction zu übergeben: 'new SqlBulkCopy (sqConn, SqlBulkCopyOptions.KeepIdentity, null) ' – Thorin

0

Sieht aus wie Ihre SQL Server-Authentifizierung im gemischten Modus deaktiviert ist.

Klicken Sie mit der rechten Maustaste auf Ihre DB-Instanz und wählen Sie Eigenschaften. Klicken Sie auf Sicherheit und in der Server-Authentifizierung wählen Sie das zweite Optionsfeld SQL Server und Windows Authentication Mode.

Nach diesem Bitte starten Sie SQL-Dienst von services.msc

+0

Wenn das der Fall wäre, würde auch das zweite Format von SQLBulkCopy nicht funktionieren. – davehay

+0

@davehay: Kannst du bitte die Verbindungszeichenfolge, die du hier verwendest, in der Konfigurationsdatei –

+0

überprüfen, ob du einen "integrated security" Teil in deinem Verbindungsstring hast. Wenn dies der Fall ist, versuchen Sie, den Teil "integrierte Sicherheit" aus der DB-Verbindungszeichenfolge zu entfernen, und versuchen Sie es erneut. Dadurch wird Ihre Verbindung so eingestellt, dass die Windows-Authentifizierung anstelle der SQL-Authentifizierung verwendet wird. –

Verwandte Themen