在做一些web数据库管理系统的时候经常要实现将帐户批量注册的功能,今天就来讲讲如何在C#-web项目中将txt文件和excel文件导入SQL2000数据库。 1.数据库准备 在SQL2000数据库的实例数据库pubs中建立一个数据表txtInsert,字段很简单:id,name两个。 2.txt文本文件导入 对于数据文件导入与导出SQL2000提供了BULK INSERT和BCP语句,在这里可以使用BULK INSERT命令实现。假设在c盘上有一个文本文件stu.txt内容为: 1,tom 2,jack 3,jhon ...... 实现导入的C#代码如下: protected System.Web.UI.HtmlControls.HtmlInputFile fName; protected System.Web.UI.WebControls.Button BtnInsert; //上面两个控件自己添加
private void BtnInsert_Click( object sender, System.EventArgs e) { string fPath = this .fName.PostedFile.FileName; // 获得要导入的文本文件 string extName = fPath.Substring(fPath.LastIndexOf( " . " ) + 1 ); // 获得文件的扩展名 SqlConnection con = new SqlConnection( " server=.;database=pubs;uid=sa;pwd=; " ); // 数据库连接对象 con.Open(); try { SqlCommand com = new SqlCommand( " BULK INSERT pubs.dbo.txtInsert FROM ' " + fPath + " ' WITH (FIELDTERMINATOR = ',',ROWTERMINATOR= '/n') " ,con); // 其中的FIELDTERMINATOR=','指明字段间所使用的分隔符为逗号 // 其中ROWTERMINATOR= '/n'指明记录间所使用的分隔符为回车 com.ExecuteNonQuery(); Response.Write( " <script language=javascript>alert('数据导入成功!')</script> " ); } catch (SqlException SQLexc) { Response.Write( " 导入数据库时出错: " + SQLexc.ToString()); } con.Close(); }
好了,这个txt文件的导入相对简单,在数据库中我也没有设置主键,我在里面也没有加出错回滚事务操作,在下面的excel文件的导入中介绍。 3.excel文件的导入 在c盘里建立一个stu.xls文件,在sheet1工作表中有两列数据如下: 编号 姓名 1 tom 2 jack 3 john ...... 注意,工作表的第一行是作为标题行的不会被插入到数据库中,真正导入从第二行开始。 为了演示事物出错回滚,在这里将txtInsert数据库表中的id字段设置为主键。实现的C#代码如下:
private void BtnInsert_Click( object sender, System.EventArgs e) { string fPath = this .fName.PostedFile.FileName; // 获得要导入的文本文件 string extName = fPath.Substring(fPath.LastIndexOf( " . " ) + 1 ); // 获得文件的扩展名 SqlConnection con = new SqlConnection( " server=.;database=pubs;uid=sa;pwd=; " ); // 数据库连接对象 con.Open(); // 注意下面的连接字符串,是它起到了导入的作用 SqlCommand excelCmd = new SqlCommand( " insert into txtInsert select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE= " + fPath + " ',Sheet1$) " ,con); SqlTransaction myTran = con.BeginTransaction(); // 开始一个事务操作 excelCmd.Transaction = myTran; try { excelCmd.ExecuteNonQuery(); myTran.Commit(); // 提交事务 Response.Write( " <script language=javascript>alert('数据导入成功!')</script> " ); } catch (SqlException err) { myTran.Rollback(); // 出错回滚事务操作 // 以下三行是去掉数据库出错信息中的非法字符单引号、回车和换行符,否则在使用时javascript代码将有语法错误 // 因为js的编码和c#的编码不同 string errString = err.Message.Replace( " ' " , " " ); errString = errString.Replace(Convert.ToChar( 13 ).ToString(), "" ); errString = errString.Replace(Convert.ToChar( 10 ).ToString(), "" ); // 显示出错信息框 Response.Write( " <script language=javascript>alert('导入数据库时出错!详细信息: " + errString + " ')</script> " ); } con.Close(); }
这里“显示出错信息框”开始我没有田间那三行代码,结果搞了半天,最后还是在html文件中发现javascript代码部分出现了分行,老是提示“未结束的字符串常量”,所以导致不能打开信息框,郁闷死我了,花了好多时间。 4.将excel中部分列导入数据库的方法 上面讲了关于将整个excel文件导入数据库的方法,那么在实际项目中遇到将excel文件中若干列导入数据库怎么办的呢,原理差不多,我就将代码直接给出了: