在做一些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檔案中若幹列導入資料庫怎麼辦的呢,原理差不多,我就将代碼直接給出了:
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();
string mystring = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = ' " + fPath + " ';Extended Properties=Excel 8.0 " ;
OleDbConnection cnnxls = new OleDbConnection (mystring);
OleDbDataAdapter myDa = new OleDbDataAdapter( " select * from [Sheet1$] " ,cnnxls);
DataSet myDs = new DataSet();
myDa.Fill(myDs);
if (myDs.Tables[ 0 ].Rows.Count > 0 )
{
string strSql = "";
string CnnString="Provider=SQLOLEDB;database=pubs;server=.;uid=sa;pwd=";
OleDbConnection conn =new OleDbConnection(CnnString);
conn.Open ();
OleDbCommand myCmd =null;
for(int i=0; i<myDs.Tables[0].Rows.Count;i++)//第一個工作表中行數,不包括第一行,
{
strSql="insert into txtInsert(id,name) values (";
strSql += myDs.Tables[0].Rows[i].ItemArray[0].ToString() + ", '";
strSql += myDs.Tables[0].Rows[i].ItemArray[1].ToString() + "')";
myCmd=new OleDbCommand(strSql,conn);
try
{
myCmd.ExecuteNonQuery();
Response.Write("<script language=javascript>alert('資料導入成功!')</script>");
}
catch (OleDbException err)
{
Response.Write("導入資料庫時出錯:" +err.ToString());
break;
}
}
conn.Close(); 其他部分代碼自己加吧,這裡就是出錯失誤復原有點不好處理,請高手指教!!
轉載于:https://www.cnblogs.com/mc-dragon/archive/2007/01/18/624238.html