c#从SQL查询构建非常大的文本文件

时间:2016-09-09 13:31:11

标签: c# sql

我从SQL数据库中获取了100多个表,并将所有数据写入1个文件。在SQL中,我运行了一个复杂的查询来将表格格式化为一个视图。 在VS中,我连接到SQL并从视图中选择*并使用String Builder构建文件。

如果我尝试抓住100%,如果我只获取5%的数据并因内存异常而崩溃,则此方法有效。该视图有1000万条记录。我在寻求建议。感谢。

$(document).ready(function(){
    $("#add_cart").click(function() {
        $("#output").empty();
        $("tbody tr").each(function() {
            if($(this).hasClass("selected")){
                $('#output').append($('<li>'+$(this).find("td:eq(1)").text()+' | '+$(this).find("td:eq(2)").text()+'</li>'));
            }
        });
    });
});

3 个答案:

答案 0 :(得分:6)

正如D Stanley所提到的那样,你需要在阅读的同时进行编写,这样一切都可以直接进入磁盘,而不是首先进入内存然后进入磁盘。这样的事情会起作用。

string cs4 = ConfigurationManager.ConnectionStrings["example"].ConnectionString;

using (SqlConnection con4 = new SqlConnection(cs4))
using(StreamWriter file4 = new StreamWriter(@"\\Desktop" + todaysDate + ".csv"))
{
    string strTQuery = @"SELECT A, B, C, D FROM [dbo].[view]";
    var command = new SqlCommand(strTQuery, con4);
    con4.Open();
    var reader = command.ExecuteReader();

    while(reader.Read())
    {
        file4.Write(reader.GetString(0) + strDelimiter);
        file4.Write(reader.GetString(1) + strDelimiter);
        file4.Write(reader.GetString(2) + strDelimiter);
        file4.Write(reader.GetString(3));
        file4.Write("\r\n");
    }
}

您还应该使用SqlDataReader而不是DataSet,因为这是一个前向移动指针,并在每次迭代时检索结果。

答案 1 :(得分:0)

您试图将整个文件存储在运行时内存中,这就是您收到内存错误的原因。尝试保存文件块并修改文件。

string cs4 = ConfigurationManager.ConnectionStrings["example"].ConnectionString;
            StringBuilder sb4 = new StringBuilder();
            using (SqlConnection con4 = new SqlConnection(cs4))
            {
                StreamWriter file4 = new StreamWriter(@"\\Desktop" + todaysDate + ".csv", true);
                string strTQuery = @"SELECT * FROM [dbo].[view]";
                SqlDataAdapter da4 = new SqlDataAdapter(strTQuery, con4);
                DataSet ds4 = new DataSet();
                da4.Fill(ds4);

                ds4.Tables[0].TableName = "Example";

                foreach (DataRow exDR in ds4.Tables["Example"].Rows)
                {
                    sb4 = new StringBuilder();
                    sb4.Append(exDR["A"].ToString() + strDelimiter);
                    sb4.Append(exDR["B"].ToString() + strDelimiter);
                    sb4.Append(exDR["C"].ToString() + strDelimiter);
                    sb4.Append(exDR["D"].ToString());
                    sb4.Append("\r\n");

                    file4.WriteLine(sb4.ToString());
                }
                file4.Close();
            }

答案 2 :(得分:-1)

问题出在这一行:

file4.WriteLine(sb4.ToString());

原因是CLR中没有对象可以大于2GB。 在这种情况下你的字符串异常大,甚至不需要这样的行为(ToString我的意思)。 要避免此问题,请使用FileStream在收到数据时写入数据。