用StreamWriter和SqlDataReader导出数据到CSV文件
2010-03-08 15:01
453 查看
导出数据CSV文件有很多种方法,我要导出的表中数据有几百兆,如果放在内存中处理,对执行程序的客户端会有比较高的要求/// <summary>
/// 从数据库中导出符合查询条件的数据到CSV文件,用StreamWriter和SqlDataReader读出,程序对系统内存要求小
/// </summary>
/// <param name="sql">符合查询条件的sql语句</param>
/// <param name="FileName">csv文件名</param>
/// <param name="splitChar">分隔符</param>
/// <returns></returns>
public static bool WriteCSVFlie(string sql, string FileName, string splitChar)
{
bool bl = true;
try
{
//实例化一个文件流--->与写入文件相关联
FileStream fs = new FileStream(FileName, FileMode.Create);
//实例化一个StreamWriter-->与fs相关联
Encoding encode = Encoding.GetEncoding("gb2312");
StreamWriter sw = new StreamWriter(fs, encode);
using (SqlConnection connection = new SqlConnection(ConfigurationManager.AppSettings["DBConnectionString"]))//初始化配置文件中的数据库连接
{
SqlCommand command = new SqlCommand(sql, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
int i = 0;
// Call Read before accessing data.
while (reader.Read())
{
if (i == 0)
{
//write data column name 第一行导出列名
string columnname = string.Empty;
for (int j = 0; j < reader.FieldCount; j++)
{
if (j == reader.FieldCount - 1)
columnname += reader.GetName(j);
else
columnname += reader.GetName(j) + splitChar;
}
sw.WriteLine(columnname);
}
string linecontent = string.Empty;
for (int j = 0; j < reader.FieldCount; j++)
{
if (j == reader.FieldCount - 1)
linecontent += reader[j].ToString().Trim().Replace(splitChar, "-_-");//考虑到分隔符可能在导出的数据中存在,需要把数据中存在的分隔符替换成特殊字符串处理,在导入数据库时可以再用程序把特殊字符替换回来
else
linecontent += reader[j].ToString().Trim().Replace(splitChar, "-_-") + splitChar;
}
sw.WriteLine(linecontent);
i += 1;
}
// Call Close when done reading.
reader.Close();
}
//清空缓冲区
sw.Flush();
//关闭流
sw.Close();
fs.Close();
}
catch (Exception ex)
{
bl = false;
throw ex;
}
return bl;
}
把csv文件导入数据库的代码介绍,采用bulkCopy方法批量导入数据比较方便。
/// <summary>
/// 将DataTable的数据导入到数据库
/// </summary>
/// <param name="datatable">DataTable对象</param>
/// <param name="conn">数据库连接串</param>
/// <param name="destTable">目标表格</param>
public static void BCPInForDatatable(DataTable datatable, string conn, string destTable)
{
SqlBulkCopy bulkCopy = null;
try
{
//先删除表内数据
GetSQL.TruncateTable(destTable);
using (bulkCopy = new SqlBulkCopy(conn))
{
//一次批量的插入的数据量
bulkCopy.BatchSize = 1000;
//超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
bulkCopy.BulkCopyTimeout = 60;
//設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。
bulkCopy.NotifyAfter = 10000;
bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.DestinationTableName = destTable;
Console.WriteLine("Import To DB!");
bulkCopy.WriteToServer(datatable);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (bulkCopy != null)
{
try { bulkCopy.Close(); }
catch (Exception ex) { }
bulkCopy = null;
}
}
}
private static void OnSqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
Console.WriteLine("Current Insert Row Number:" + e.RowsCopied.ToString());
}
public static int TruncateTable(string tablename)
{
string sql = "truncate table " + tablename;
return SqlHelper.ExecuteNonQuery(SqlHelper.CenterConnStr, CommandType.Text, sql, null);
}
/// 从数据库中导出符合查询条件的数据到CSV文件,用StreamWriter和SqlDataReader读出,程序对系统内存要求小
/// </summary>
/// <param name="sql">符合查询条件的sql语句</param>
/// <param name="FileName">csv文件名</param>
/// <param name="splitChar">分隔符</param>
/// <returns></returns>
public static bool WriteCSVFlie(string sql, string FileName, string splitChar)
{
bool bl = true;
try
{
//实例化一个文件流--->与写入文件相关联
FileStream fs = new FileStream(FileName, FileMode.Create);
//实例化一个StreamWriter-->与fs相关联
Encoding encode = Encoding.GetEncoding("gb2312");
StreamWriter sw = new StreamWriter(fs, encode);
using (SqlConnection connection = new SqlConnection(ConfigurationManager.AppSettings["DBConnectionString"]))//初始化配置文件中的数据库连接
{
SqlCommand command = new SqlCommand(sql, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
int i = 0;
// Call Read before accessing data.
while (reader.Read())
{
if (i == 0)
{
//write data column name 第一行导出列名
string columnname = string.Empty;
for (int j = 0; j < reader.FieldCount; j++)
{
if (j == reader.FieldCount - 1)
columnname += reader.GetName(j);
else
columnname += reader.GetName(j) + splitChar;
}
sw.WriteLine(columnname);
}
string linecontent = string.Empty;
for (int j = 0; j < reader.FieldCount; j++)
{
if (j == reader.FieldCount - 1)
linecontent += reader[j].ToString().Trim().Replace(splitChar, "-_-");//考虑到分隔符可能在导出的数据中存在,需要把数据中存在的分隔符替换成特殊字符串处理,在导入数据库时可以再用程序把特殊字符替换回来
else
linecontent += reader[j].ToString().Trim().Replace(splitChar, "-_-") + splitChar;
}
sw.WriteLine(linecontent);
i += 1;
}
// Call Close when done reading.
reader.Close();
}
//清空缓冲区
sw.Flush();
//关闭流
sw.Close();
fs.Close();
}
catch (Exception ex)
{
bl = false;
throw ex;
}
return bl;
}
把csv文件导入数据库的代码介绍,采用bulkCopy方法批量导入数据比较方便。
/// <summary>
/// 将DataTable的数据导入到数据库
/// </summary>
/// <param name="datatable">DataTable对象</param>
/// <param name="conn">数据库连接串</param>
/// <param name="destTable">目标表格</param>
public static void BCPInForDatatable(DataTable datatable, string conn, string destTable)
{
SqlBulkCopy bulkCopy = null;
try
{
//先删除表内数据
GetSQL.TruncateTable(destTable);
using (bulkCopy = new SqlBulkCopy(conn))
{
//一次批量的插入的数据量
bulkCopy.BatchSize = 1000;
//超时之前操作完成所允许的秒数,如果超时则事务不会提交 ,数据将回滚,所有已复制的行都会从目标表中移除
bulkCopy.BulkCopyTimeout = 60;
//設定 NotifyAfter 属性,以便在每插入10000 条数据时,呼叫相应事件。
bulkCopy.NotifyAfter = 10000;
bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
bulkCopy.DestinationTableName = destTable;
Console.WriteLine("Import To DB!");
bulkCopy.WriteToServer(datatable);
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (bulkCopy != null)
{
try { bulkCopy.Close(); }
catch (Exception ex) { }
bulkCopy = null;
}
}
}
private static void OnSqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
Console.WriteLine("Current Insert Row Number:" + e.RowsCopied.ToString());
}
public static int TruncateTable(string tablename)
{
string sql = "truncate table " + tablename;
return SqlHelper.ExecuteNonQuery(SqlHelper.CenterConnStr, CommandType.Text, sql, null);
}
相关文章推荐
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- Android将SQLite数据表导出到csv格式文件
- sql server 小技巧(7) 导出完整sql server 数据库成一个sql文件,包含表结构及数据
- 利用SqlDataReader读取大量的数据库数据
- 使用SqlDataReader读取数据示例
- SQL Server 2008将数据导出到SQL脚本文件
- asp.net中SqlDataReader获取数据存在的问题解决方法
- PostgreSQL导出数据到sql文件
- SQLServer 2008 R2导出的SQL文件中没有数据
- 怎么把Microsoft sql server 2000 的数据导出.sql文件
- 使用Visual Studio自带数据库配合SqlDataReader 读取数据库数据
- SqlDataReader And SqlCommand读取数据
- JScript.Net 之 SqlDataReader读取数据
- ASP.NET优化连载(三)只读数据访问用SqlDataReader,不要使用DataSet
- mssql将一张表的数据导出sql文件
- 数据库导入/导出csv格式的数据文件+添加新的字段
- EXCEL VBA中写了个宏把本EXCEL中的表数据批量导出为csv格式的文件
- SQL 读取csv 文件批量插入数据
- Android将SQLite数据表导出到csv格式文件
- SQLServer2008R2导出包含数据的SQL脚本文件