使用SQL Server身份验证时,SqlBulkCopy
命令存在问题。 Windows身份验证不会出现此问题。
SqlBulkCopy sbc = new SqlBulkCopy(sqConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity);
这会引发错误:
用户'xx'
的登录失败
代码:
SqlBulkCopy sbc = new SqlBulkCopy(sqConn);
这很好但不保留标识列的原始值。
答案 0 :(得分:3)
“永久安全性信息= true”。否则,如果连接已经打开,则会从sqConn.ConnectionString中删除密码。
答案 1 :(得分:1)
解决方案非常简单,但我仍然有兴趣知道为什么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();
}
答案 2 :(得分:0)
看起来您的SQL Server混合模式身份验证已关闭。
右键单击数据库实例,然后选择“属性”。 单击安全性,然后在服务器身份验证中选择第二个单选按钮SQL Server和Windows身份验证模式。
之后请从services.msc重新启动SQL服务
答案 3 :(得分:0)
尝试一下对我有用的
private static void BulkInsert(DataTable dtExcel, SqlConnection con)
{
try
{
{
if (con.State == ConnectionState.Closed)
con.Open();
var sqlTransactionScope = con.BeginTransaction();
//Open bulkcopy connection.
using (SqlBulkCopy bulkcopy = new SqlBulkCopy(con, SqlBulkCopyOptions.Default, sqlTransactionScope))
{
//Set destination table name
bulkcopy.BulkCopyTimeout = 0;
bulkcopy.BatchSize = 1000;
bulkcopy.DestinationTableName = "[dbo].[cc_alertowner]";
try
{
foreach (DataColumn col in dtExcel.Columns)
{
bulkcopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(col.ColumnName, col.ColumnName));
}
// bulkcopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("", ""));
// bulkcopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("DateCreated", "DateCreated"));
if (con.State == ConnectionState.Closed)
con.Open();
bulkcopy.WriteToServer(dtExcel);
sqlTransactionScope.Commit();
}
catch (Exception ex)
{
sqlTransactionScope.Rollback();
throw;
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}