SqlBulkCopy登录失败

时间:2016-11-24 07:01:00

标签: sql-server

使用SQL Server身份验证时,SqlBulkCopy命令存在问题。 Windows身份验证不会出现此问题。

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

这会引发错误:

  

用户'xx'

的登录失败

代码:

SqlBulkCopy sbc = new SqlBulkCopy(sqConn);

这很好但不保留标识列的原始值。

4 个答案:

答案 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;
            }
        }