C#SQL导出(OutofMemory问题)

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

string contents = File.ReadAllText(textBox3.Text); string tableid = tableid = Regex.Match(contents, @"CoreDBCaseID=(?\d+)").Groups["id"].Value; string server = server = Regex.Match(contents, @"Server=(?[^;]+)").Groups["Server"].Value; string security = security = Regex.Match(contents, "Security=(?[^;]+)").Groups["Security"].Value; string database = database = Regex.Match(contents, "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().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().ToList() .Select(col => col.ColumnName) .Aggregate((current, next) => current + "|" + next) + "\r\n" + tbltarget.Rows.Cast().ToList() .Select(row => row.ItemArray.Aggregate((current, next) => current.ToString() + "|" + next.ToString().Replace("\n", ""))) .Cast().Aggregate((current, next) => current + "\r\n" + next); File.WriteAllText(@"C:\Export.txt); con.Close(); 

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

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


简单的例子:

 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 } }}} 

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

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