本文介绍并且实现了在平面文件CSV和SQL server之间的导入导出功能。使用VS2005写的。使用了.net 2.0
本文基于前一篇文章:从CSV导入数据并存储到数据库,本文包含了新功能,比如,导出功能,在数据库创建表,批量拷贝。接下来的例子中有很多注释。
导入
通过ODBC驱动连接到一个CSV文件,然后把文件读到一张表了(基于前面提到的那篇文章) 使用不同的编码和不同的行分隔符(基于前文) 加载CSV文件到DataSet(基于前文) 如何显示对CSV文件的预览(基于前文) 通过SqlBulkCopy的对象向SQL server转移数据,原始数据是DataSet实例
使用结构表,基于CSV文件,创建一个新表 使用事件来处理批量拷贝的进程 导出
浏览SQL 数据库中的用户表 使用不同的编码和分隔符 使用SqlDataReader读取数据,使用StreamWriter转移数据到平面文件
- 下载工程
- 新建一个数据库,或者使用一个存在的数据库
- 修改软件中的数据库连接字符串,在prop.cs文件中
public static string sqlConnString = "server=(local); database=Test_CSV_impex;Trusted_Connection=True";
- 运行工程
一些代码段 加载CSV到DataSet中
/*
*加载CSV到DataSet.
*
* 如果numberOfRows parameter 是 -1, 就加载所有行, 否则就加载指定数目的行
*/
public DataSet LoadCSV(int numberOfRows)
{
DataSet ds = new DataSet();
try
{
// 创建并打开ODBC连接
string strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)};
Dbq=" + this.dirCSV.Trim() + ";
Extensions=asc,csv,tab,txt;Persist Security Info=False";
string sql_select;
OdbcConnection conn;
conn = new OdbcConnection(strConnString.Trim());
conn.Open();
//创建SQL语句
if (numberOfRows == -1)
{
sql_select = "select * from [" +
this.FileNevCSV.Trim() + "]";
}
else
{
sql_select = "select top " + numberOfRows +
" * from [" + this.FileNevCSV.Trim() + "]";
}
//创建数据适配器
OdbcDataAdapter obj_oledb_da = new OdbcDataAdapter(sql_select, conn);
//用CSV的数据填充DataSet
obj_oledb_da.Fill(ds, "csv");
//关闭连接
conn.Close();
}
catch (Exception e) //异常处理
{
MessageBox.Show(e.Message, "Error - LoadCSV",
MessageBoxButtons.OK,MessageBoxIcon.Error);
}
return ds;
}
通过SqlBulkCopy从ODBC连接中转移数据到数据库
/*
*通过SqlBulkCopy从ODBC连接中转移数据到数据库
* 该方法不使用临时的dataset,而是直接从ODBC连接中加载数据
*/
private void SaveToDatabaseDirectly()
{
try
{
if (fileCheck())
{
// 选择 格式,编码 ,并且写结构表
Format();
Encoding();
writeSchema();
// 创建并打开ODBC连接
string strConnString = "Driver={Microsoft Text Driver
(*.txt; *.csv)};Dbq=" + this.dirCSV.Trim() + ";
Extensions=asc,csv,tab,txt;
Persist Security Info=False";
string sql_select;
OdbcConnection conn;
conn = new OdbcConnection(strConnString.Trim());
conn.Open();
//通过SQL语句统计CVS的行数
OdbcCommand commandRowCount = new OdbcCommand
("SELECT COUNT(*) FROM [" +
this.FileNevCSV.Trim() + "]", conn);
this.rowCount = System.Convert.ToInt32
(commandRowCount.ExecuteScalar());
// 创建ODBC命令
sql_select = "select * from [" +
this.FileNevCSV.Trim() + "]";
OdbcCommand commandSourceData =
new OdbcCommand(sql_select, conn);
// 创建OdbcDataReader读取CSV数据
OdbcDataReader dataReader =
commandSourceData.ExecuteReader();
// 创建结构表.
// 提供列名来创建表
DataTable dt;
dt = dataReader.GetSchemaTable();
// 可以预览表:
//this.dataGridView_preView.DataSource = dt;
// 创建一个新的空表
CreateTableInDatabase(dt, this.txtOwner.Text,
this.txtTableName.Text, prop.sqlConnString);
//从原数据拷贝数据到数据库
using (SqlBulkCopy bc = new SqlBulkCopy
("server=(local);database=Test_CSV_impex;
Trusted_Connection=True"))
{
// 本例不检查表所有者和表名
bc.DestinationTableName = "[" +
this.txtOwner.Text + "].[" +
this.txtTableName.Text + "]";
// 通过SqlRowsCopied事件来通知
bc.NotifyAfter = 100;
bc.SqlRowsCopied +=
new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
// 开始大量拷贝.
bc.WriteToServer(dataReader);
// 关闭SqlBulkCopy实例
bc.Close();
}
// 向窗体显示导入的数目
this.lblProgress.Text = "Imported: " +
this.rowCount.ToString() + "/" +
this.rowCount.ToString() + " row(s)";
this.lblProgress.Refresh();
// 通知用户
MessageBox.Show("ready");
}
}
catch (Exception e)
{
MessageBox.Show(e.Message, "Error - SaveToDatabaseDirectly",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
基于结构表创建表
/*
* 使用结构表生成创建表的命令, 并且在数据库执行
*/
private bool CreateTableInDatabase(DataTable dtSchemaTable, string tableOwner,
string tableName, string connectionString)
{
try
{
// 生成创建表的命令
// 结构表的第一行包含列名.
// 所有列的数据类型是 nvarcher(4000)
string ctStr = "CREATE TABLE [" + tableOwner + "].[" +
tableName + "](\r\n";
for (int i = 0; i < dtSchemaTable.Rows.Count; i++)
{
ctStr += " [" + dtSchemaTable.Rows[i][0].ToString() + "]
[nvarchar](4000) NULL";
if (i < dtSchemaTable.Rows.Count)
{
ctStr += ",";
}
ctStr += "\r\n";
}
ctStr += ")";
// 你可以检查Sql语句
//MessageBox.Show(ctStr);
// 执行SQL语句生成表.
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand command = conn.CreateCommand();
command.CommandText = ctStr;
conn.Open();
command.ExecuteNonQuery();
conn.Close();
return true;
}
catch (Exception e)
{
MessageBox.Show(e.Message, "CreateTableInDatabase",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
获取数据库中用户表名
/*
* 加载数据库里的用户表,并且用表名填充listbox控件
*/
private void loadTables()
{
// 连接到数据库,选择表名.
SqlConnection cn = new SqlConnection(prop.sqlConnString);
SqlDataAdapter da = new SqlDataAdapter
("select name from dbo.sysobjects where xtype = 'U'
and name <> 'dtproperties' order by name", cn);
DataTable dt = new DataTable();
// 填充列表到 DataTable.
da.Fill(dt);
// 清空ListBox
this.lbxTables.Items.Clear();
// 填充表名到 ListBox.
//如果数据库没有用户名则通知用户
if (dt.Rows.Count == 0)
{
MessageBox.Show("There is no user table in the specified database.
Import a CSV file first.", "Warning",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
this.lbxTables.Items.Add("< no user table in database >");
this.btnExportToCSV.Enabled = false;
}
else
{
this.btnExportToCSV.Enabled = true;
for (int i = 0; i < dt.Rows.Count; i++)
{
this.lbxTables.Items.Add(dt.Rows[i][0].ToString());
}
this.lbxTables.SelectedIndex = 0;
}
}
通过StreamWriter写数据
/*
* 导出数据到CSV文件
*/
private void exportToCSVfile(string fileOut)
{
// 连接到数据库,生成选择命令.
SqlConnection conn = new SqlConnection(prop.sqlConnString);
string sqlQuery = "select * from " + this.lbxTables.SelectedItem.ToString();
SqlCommand command = new SqlCommand(sqlQuery, conn);
conn.Open();
// 创建SqlDataReader实例从表中读取数据
SqlDataReader dr = command.ExecuteReader();
// 检索表的结构
DataTable dtSchema = dr.GetSchemaTable();
// 用流创建CSV文件,使用指定的编码
StreamWriter sw = new StreamWriter(fileOut, false, this.encodingCSV);
string strRow; // 表示一行
// 如果用户要求,写入表头.
if (this.chkFirstRowColumnNames.Checked)
{
sw.WriteLine(columnNames(dtSchema, this.separator));
}
// 从SqlDataReader 一行行读
// 通过给定的分隔符转换成字符串然后写到文件里
while (dr.Read())
{
strRow = "";
for (int i = 0; i < dr.FieldCount; i++)
{
strRow += dr.GetString(i);
if (i < dr.FieldCount - 1)
{
strRow += this.separator;
}
}
sw.WriteLine(strRow);
}
// 关闭文本流和数据库连接
sw.Close();
conn.Close();
// 通知用户
MessageBox.Show("ready");
}
Demo下载 CSV_import_export 许可 本文包括源代码和文件在CPOL下授权
原文地址:C-CSV-Import-Export

