有没有比DataTable.Load(DataReader)填充数据表更快/更智能的方法? C#

时间:2016-06-06 13:21:33

标签: c# datatable sqldatareader

我正在做一些研究,以便更好地理解SQL并使用DataTables。 所以我试图从MS SQL数据库中获得良好的性能读取数据并将其加载到datagridview中。

我已经创建了一个SQL函数,我从我的工具调用它并将结果加载到数据表中。 如果我在SSMS中执行此功能,则需要11-12秒来加载结果(差不多150万个条目),但如果我使用该工具执行此功能,我编码,则需要30秒以上(仅用于执行DataTable.Load(SqlDataReader))

到目前为止,我所做的是:

    private DataTable GetDataFromDB(string userId, string docId, DateTimeOffset date)
    {            
        string cmd = String.Format("select * from dbo.GetData(@userId, @docId, @dueDate);");

        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            SqlCommand command = new SqlCommand(cmd, conn);

            if (String.IsNullOrEmpty(userId))
                command.Parameters.AddWithValue("@userId", DBNull.Value);
            else
                command.Parameters.AddWithValue("@userId", userId);

            if (String.IsNullOrEmpty(docId))
                command.Parameters.AddWithValue("@docId", DBNull.Value);
            else
                command.Parameters.AddWithValue("@docId", docId);
            command.Parameters.AddWithValue("@dueDate", dueDate);

            SqlDataReader reader = command.ExecuteReader();

            stopWatch.Reset();
            stopWatch.Start();

            table.BeginLoadData();
            table.Load(reader, LoadOption.Upsert);
            table.EndLoadData();
            stopWatch.Stop();
            reader.Close();
            reader.Dispose();
            conn.Close();
        }

        return table;
    }

我已经做了一些谷歌研究,这是我能想到的最好的。到目前为止它运作良好,但我很好奇是否有可能更快地获得结果。有任何想法吗? 我的内存也有问题。一旦我开始通话,该工具将分配高达900MB的RAM,直到它具有所有条目。我已经管理过它,每次调用上面的函数时都要释放内存,但我认为,900MB是相当多的,另一个问题是,它不会释放所有需要的RAM。例如:当我启动该工具时,它需要大约7MB的RAM,如果我第一次调用上面的方法,它将需要900MB。如果我下次调用它,它将释放大部分内存,但仍需要930MB。第三次960MB等。因此,每次调用它都会分配更多的内存,如果经常调用此方法,这将导致系统内存不足并出现#Ex;

非常感谢你!

2 个答案:

答案 0 :(得分:1)

性能会根据您加载的数据量和数量而有所不同。 下面的链接将为您提供性能报告的解决方案。用你的方法尝试这样的事情并比较性能。

希望这会对你有所帮助。

Fastest way to populate datatable

答案 1 :(得分:0)

对我来说使用 DataTable.Load(SqlDataReader)是最快的方法

        DataTable dt = new DataTable();
        using (var con = new SqlConnection { ConnectionString = "ConnectionString" })
        {
            using (var command = new SqlCommand { Connection = con })
            {
                con.Open();
                command.CommandText = @"SELECT statement.....";
                command.Parameters.AddWithValue("@param", "Param");
                //load the into DataTable
                dt.Load(command.ExecuteReader(), LoadOption.Upsert);
            }// this will dispose command

        }// this will dispose and close connection