C#SQL导出(OutofMemory问题)

时间:2009-12-11 14:52:03

标签: c# sql

我正在尝试批量导出sql表,代码工作正常。 Nothign完全错了,问题在于以270万行导出50列。任何人都可以帮助我处理OUtofMemory异常。我知道它为什么会发生这种情况,因为它试图将所有内容全部读入内存然后写入,但我不确定如何将其分解为逐行读取然后写出而不需要永远记录。

string contents = File.ReadAllText(textBox3.Text);

string tableid = tableid = Regex.Match(contents, @"CoreDBCaseID=(?<id>\d+)").Groups["id"].Value;
string server = server = Regex.Match(contents, @"Server=(?<Server>[^;]+)").Groups["Server"].Value;
string security = security = Regex.Match(contents, "Security=(?<Security>[^;]+)").Groups["Security"].Value;
string database = database = Regex.Match(contents, "Database=(?<Database>[^\r]+)").Groups["Database"].Value;

string[] data = new string[] {
    string.Format("Table={0}", tableid),
    string.Format("Server={0}", server),
    string.Format("Security={0}", security),
    string.Format("Database={0}", database),
};
string sqltable = ("TDS_C" + tableid + "_table");
String cols = String.Join(",", listBox1.Items.Cast<String>().ToArray());
string sql = "select " + cols + " from " + sqltable + " where *;
SqlConnection con = new SqlConnection("Data Source=" + server + ";Initial Catalog=" + database + ";Integrated Security=" + security);
con.Open();
SqlDataAdapter tabadapter = new SqlDataAdapter(sql, con);
DataSet dataset = new DataSet();
tabadapter.FillSchema(dataset, SchemaType.Source, sqltable);
tabadapter.Fill(dataset, sqltable);
DataTable tbltarget = dataset.Tables[0];
string output_text =
    tbltarget.Columns.Cast<DataColumn>().ToList()
    .Select(col => col.ColumnName)
    .Aggregate((current, next) => current + "|" + next) + "\r\n"
+
    tbltarget.Rows.Cast<DataRow>().ToList()
    .Select(row => row.ItemArray.Aggregate((current, next) => current.ToString() + "|" + next.ToString().Replace("\n", "")))
    .Cast<string>().Aggregate((current, next) => current + "\r\n" + next);

File.WriteAllText(@"C:\Export.txt);

con.Close();

3 个答案:

答案 0 :(得分:4)

不要填充数据集。相反,使用数据读取器,然后您可以在读取数据时将其流出,这意味着更小的内存占用。

您可以考虑从数据库执行异步读取,并触发对文件的异步写入。这将阻止每个读写操作完全阻塞。


简单示例:

using (SqlConnection connection = new SqlConnection(connectionString)){
connection.Open();
using (FileStream strm = new FileStream(filePath)){
using (TextWriter wrt = new TextWriter(strm)){
SqlCommand cmd = new SqlCommand(sql, connection);
IDataReader rdr = cmd.ExecuteReader();
while rdr.Read()
{
    wrt.Write(rdr[0].ToString() + "|" + rdr[1].ToString(); // change for your manipulation of the columns
}
}}}

答案 1 :(得分:1)

这是SSIS最好的办法(如果你使用的是SQL Server)。然后从代码中调用SSIS包。您不应该将数据量从数据库服务器移动到应用程序服务器进行处理。创建大型导出文件最好只从数据库中完成。

答案 2 :(得分:0)

一次选择10k行怎么样?然后在他们之间写作。你提供的两种选择的混合物。