介绍

本文介绍并且实现了在平面文件CSV和SQL server之间的导入导出功能。使用VS2005写的。使用了.net 2.0

本文基于前一篇文章:从CSV导入数据并存储到数据库,本文包含了新功能,比如,导出功能,在数据库创建表,批量拷贝。接下来的例子中有很多注释。

导入

通过ODBC驱动连接到一个CSV文件,然后把文件读到一张表了(基于前面提到的那篇文章) 使用不同的编码和不同的行分隔符(基于前文) 加载CSV文件到DataSet(基于前文) 如何显示对CSV文件的预览(基于前文) 通过SqlBulkCopy的对象向SQL server转移数据,原始数据是DataSet实例

使用结构表,基于CSV文件,创建一个新表 使用事件来处理批量拷贝的进程 导出

浏览SQL 数据库中的用户表 使用不同的编码和分隔符 使用SqlDataReader读取数据,使用StreamWriter转移数据到平面文件

使用

  1. 下载工程
  2. 新建一个数据库,或者使用一个存在的数据库
  3. 修改软件中的数据库连接字符串,在prop.cs文件中
public static string sqlConnString = "server=(local);
	database=Test_CSV_impex;Trusted_Connection=True";
  1. 运行工程

一些代码段 加载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