2016-11-24 334 views
2

使用SQL Server身份驗證時,我遇到SqlBulkCopy命令的問題。 Windows身份驗證不會出現此問題。SqlBulkCopy登錄失敗

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

,這將引發一個錯誤:

Login failed for user 'xx'

代碼:

SqlBulkCopy sbc = new SqlBulkCopy(sqConn); 

這工作正常,但不會保留標識列的原始值。

+0

感謝編輯們。我會記得在下次把代碼放到塊中。 – davehay

回答

1

的解決這個請重新啓動SQL服務後是相當簡單的,但我還是想知道爲什麼SQL Server驗證應該從Windows身份驗證不同。

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

然後是什麼解決方案? AFAICT你沒有改變認證。 – martennis

+1

解決方案是使用事務,然後使用SQL Server身份驗證。我需要將其批量複製到Azure SQL認證不可能的地方。 – davehay

+0

'新的SqlBulkCopy()'有4個重載:'SqlConnection'只,'SqlConnection/SqlBulkCopyOptions/SqlTransaction','僅字符串'和'string/SqlBulkCopyOptions'。如果你想提供複製選項KeepIdentity,那麼你將不得不爲SqlTransaction提供一些東西,否則編譯器會嘗試匹配字符串/ SqlBulkCopyOptions重載。據我所知,沒有什麼能阻止你爲SqlTransaction傳遞一個空對象:'new SqlBulkCopy(sqConn,SqlBulkCopyOptions.KeepIdentity,null)' – Thorin

0

看起來像您的SQL Server混合模式身份驗證已關閉。

右鍵單擊您的數據庫實例並選擇屬性。 單擊安全性並在服務器身份驗證中選擇第二個單選按鈕SQL Server和Windows身份驗證模式。

從SERVICES.MSC

+0

如果是這種情況,則SQLBulkCopy的第二種格式也不起作用。 – davehay

+0

@davehay:您可以在配置文件 –

+0

中顯示您在此處使用的連接字符串,請檢查您的連接字符串中是否包含「集成安全性」部分。如果是這樣,請嘗試從數據庫連接字符串中刪除「集成安全性」部分,然後重試。 這是將您的連接設置爲使用Windows身份驗證而不是sql身份驗證。 –