Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用FastMember复制列表_C#_Sql_List_Sqlbulkcopy_Fastmember - Fatal编程技术网

C# 使用FastMember复制列表

C# 使用FastMember复制列表,c#,sql,list,sqlbulkcopy,fastmember,C#,Sql,List,Sqlbulkcopy,Fastmember,为了提高性能,我使用FastMember和线程技术完成了列表的批量复制 实际上,我需要批量复制9999999条记录,并且我已经为每1000000条记录设置了一个间隔,并清除列表以避免OutofMemory异常 整个过程花了大约16个小时才完成,现在,我的问题是:没有插入任何记录。在这个过程中,我使用nolock读取了数据,我的查询显示了数据,有时没有显示任何记录。我认为数据一直在插入和删除 原因是,我这么说是因为:如果我现在开始插入任何记录,Identity列将以百万为单位显示一个非常大的数字。

为了提高性能,我使用FastMember和线程技术完成了列表的批量复制

实际上,我需要批量复制9999999条记录,并且我已经为每1000000条记录设置了一个间隔,并清除列表以避免OutofMemory异常

整个过程花了大约16个小时才完成,现在,我的问题是:没有插入任何记录。在这个过程中,我使用nolock读取了数据,我的查询显示了数据,有时没有显示任何记录。我认为数据一直在插入和删除

原因是,我这么说是因为:如果我现在开始插入任何记录,Identity列将以百万为单位显示一个非常大的数字。 所以,据我所知,我觉得记录被插入和删除了

我的代码:

private void Btn_Start_Encrypting_Click(object sender, EventArgs e)
        {
            try
            {
                Btn_Start_Encrypting.Enabled = false;

                Lbl_Msg1.Text = "Time Started : " + DateTime.Now.ToString();

                DateTime StartTime = DateTime.Now;                

                #region List<CustomClass> with Random Numbers

                Random rand = new Random();

                Thread previousThread = null;

                for (int i = 1; i <= 999999999; i++)
                {
                    LstEncData.Add(new EncryptedData { MESSAGE_ID = rand.Next(1, 100), ENCRYPTED_DATA = EncryptDecrypt.Encrypt(i.ToString("D9")) });

                    if (i % 1000000 == 0)
                    {
                        LstEncData = LstEncData.OrderBy(p => p.MESSAGE_ID).ToList();

                        if (previousThread != null)
                        {
                            previousThread.Join();
                        }

                        List<EncryptedData> copyList = LstEncData.ToList();

                        previousThread = new Thread(() => BulkCopyList(copyList));
                        previousThread.Start();

                        LstEncData.Clear();
                    }
                }

                if (LstEncData.Count > 0)
                {
                    if (previousThread != null)
                    {
                        previousThread.Join();
                    }

                    List<EncryptedData> copyList = LstEncData.ToList();

                    previousThread = new Thread(() => BulkCopyList(copyList));
                    previousThread.Start();

                    LstEncData.Clear();
                }

                previousThread.Join();

                Lbl_Msg2.Text = "Time Ended : " + DateTime.Now.ToString();

                DateTime EndTime = DateTime.Now;

                TimeSpan duration = EndTime - StartTime;

                Lbl_Msg3.Text = "Total Time Taken in Seconds : " + duration.TotalSeconds.ToString();

                #endregion
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                Btn_Start_Encrypting.Enabled = true;
            }
        }

public void BulkCopyList(List<EncryptedData> Lst)
        {
            try
            {
                using (var bcp = new SqlBulkCopy(System.Configuration.ConfigurationManager.AppSettings["ConnectionString"]))
                {
                    using (var reader = ObjectReader.Create(Lst, "ENCRYPTED_DATA"))
                    {
                        SqlBulkCopyColumnMapping mapEncryData = new SqlBulkCopyColumnMapping("ENCRYPTED_DATA", "ENCRYPTED_DATA");
                        bcp.ColumnMappings.Add(mapEncryData);

                        bcp.DestinationTableName = "EncryptedData1";
                        bcp.WriteToServer(reader);
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }

我在线程或大容量复制附近做错了什么吗?

一次大容量插入一百万个对象太多了。BulkCopyList中的try-catch块中可能发生OutOfMemoryException,但正在隐藏它。更高的批量插入也不能转化为更快的总体性能。尝试使用100000。另一种可能是多线程大容量插入重叠,导致异常,因为两个线程同时访问同一个连接。@厌恶:是否有可能检查SQL是否有错误?可能类似于日志?你能确认BulkCopyList方法中没有发生异常吗?实际上,我开始尝试使用100000条记录。我不确定BulkCopyList方法是否有任何异常。我将尝试使用较少的记录并更新结果。