c# - 插入到 SQL 性能问题

标签 c#

我前段时间写了一个程序,可以在相当大的文本文件中进行定界和读取。该程序可以运行,但问题是它基本上会卡住计算机并且需要很长时间才能完成。平均每个文本文件有大约 10K 到 15K 行,每行代表 SQL 表中的一个新行。

我的程序的工作方式是首先读取所有行(这是分隔发生的地方)并将它们存储在数组中,然后遍历每个数组元素并将它们插入到 SQL 表中。这一切都是一次性完成的,我怀疑占用了太多内存,导致程序卡住计算机。

这是我读取文件的代码:

private void readFile()
    {
        //String that will hold each line read from the file
        String line;

        //Instantiate new stream reader 
        System.IO.StreamReader file = new System.IO.StreamReader(txtFilePath.Text);

        try
        {
            while (!file.EndOfStream)
            {
                line = file.ReadLine();

                if (!string.IsNullOrWhiteSpace(line))
                {
                    if (this.meetsCondition(line))
                    {
                        badLines++;
                        continue;
                    } // end if

                    else
                    {
                        collection.readIn(line);
                        counter++;
                    } // end else
                } // end if

            } // end while

            file.Close();

        } // end try

        catch (Exception exceptionError)
        {
            //Placeholder
        }

插入代码:

for (int i = 0; i < counter; i++)
            {
                //Iterates through the collection array starting at first index and going through until the end
                //and inserting each element into our SQL Table
                //if (!idS.Contains(collection.getIdItems(i)))
                //{
                    da.InsertCommand.Parameters["@Id"].Value = collection.getIdItems(i);
                    da.InsertCommand.Parameters["@Date"].Value = collection.getDateItems(i);
                    da.InsertCommand.Parameters["@Time"].Value = collection.getTimeItems(i);
                    da.InsertCommand.Parameters["@Question"].Value = collection.getQuestionItems(i);
                    da.InsertCommand.Parameters["@Details"].Value = collection.getDetailsItems(i);
                    da.InsertCommand.Parameters["@Answer"].Value = collection.getAnswerItems(i);
                    da.InsertCommand.Parameters["@Notes"].Value = collection.getNotesItems(i);
                    da.InsertCommand.Parameters["@EnteredBy"].Value = collection.getEnteredByItems(i);
                    da.InsertCommand.Parameters["@WhereReceived"].Value = collection.getWhereItems(i);
                    da.InsertCommand.Parameters["@QuestionType"].Value = collection.getQuestionTypeItems(i);
                    da.InsertCommand.Parameters["@AnswerMethod"].Value = collection.getAnswerMethodItems(i);
                    da.InsertCommand.Parameters["@TransactionDuration"].Value = collection.getTransactionItems(i);
                    da.InsertCommand.ExecuteNonQuery();
                //}

                //Updates the progress bar using the i in addition to 1 
                _worker.ReportProgress(i + 1);

            } // end for

最佳答案

如果您可以将您的集合映射到 DataTable,那么您可以使用 SqlBulkCopy导入您的数据。 SqlBulkCopy 是将数据从 .Net 导入到 SqlServer 的最快方法。

关于c# - 插入到 SQL 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17321986/

相关文章:

c# - ID 参数中带有反斜杠 (%2f) 的 WebApi 导致找不到 404

c# - Python .Net 未加载 .Net Standard 2.0 dll

c# - asp.net mvc 发送 httpstatuscode 200 但不返回

c# - 如何从 DataTable 向 Excel 添加其他工作表

c# - 如何测试负零?

c# - 避免在运行单元测试后构建完整的解决方案

c# - Xamarin Mono ClientWebSocket 实现不适用于安全套接字

c# - Excel Interop - 效率和性能

c# - 如何从 WPF 应用程序写入命令行?

c# - Entity Framework 、存储过程和导航属性