新鸟文章:foreach里的Sqlcommand(有SqlTransaction)
最近弄个读取Excel文件并写进数据库的东东。(很简单的东西,网上搜搜一大萝)
准备一个fileupload控件。两个Button(一个叫BTShow,另一个叫BTUpload),一个GridView
fileupload控件没做什么东西,就是通过点击“游览...”按钮(内置的),
(注:这个Text不可以修改,不过样式还是可以的。有一些人想改成"Browse...",其实这个是根据系统的设置语言走的,不过也有一些人利用TextBox和Button来达到这个目的,也就是隐藏fileupload控件,然后调用其相关事件。具体做法,各位自己网上找啦。)
来将文件的绝对路径拿出来放在fileupload的显示框里。其实也可以直接在显示框里输入,但容易出错。所以我们可以禁止这个。
看下面代码:
<asp:FileUpload ID="FUSalBud" runat="server" Height="30px" Width="224px" onkeydown="event.returnValue=false;" onpaste="return false;" />
选择文件后:
在BTShow点击事件里写:
1 protected void BTShow_Click(object sender, EventArgs e)
2 {
3 if (FUSalBud.HasFile)
4 {
5 //读取文件
6 //获取文件的后缀名
7 string FileExtension = Path.GetExtension(FUSalBud.FileName).ToLower();
8 //获取文件的名称(不包括后缀后)
9 string FileName = Path.GetFileNameWithoutExtension(FUSalBud.FileName);
10 //用来判断所允许的文件类型
11 string[] AllowExtension = { ".txt", ".gif", ".asp", ".aspx", ".doc", ".xls" };
12 string FolderName = "";
13 string FileNameExtension = "";
14 string FilePath = "";
15 bool flag = false;
16 for (int i = 0; i < AllowExtension.Length; i++)
17 {
18 if (FileExtension == AllowExtension[i])
19 {
20 try
21 {
22 //如果是Excel文件刚放到一个独立文件夹里
23 if (FileExtension == ".xls")
24 {
25 FolderName = "~/UploadFiles/ExcelFiles/";
26 }
27 else
28 FolderName = "~/UploadFiles/";
29
30 //给上传到服务器的文件起名字
31 FileNameExtension = FileName + System.DateTime.Now.Second + FileExtension;
32 //设置文件所要放的地放(绝对路径)
33 FilePath = Server.MapPath(FolderName) + FileNameExtension;
34 //ViewState["FilePathName"] = FilePath;
35 /*
36 Response.Write(FilePath + "<br>");
37 Response.Write(FUSalBud.FileName + " 文件<br>");
38 Response.Write(FileExtension + "<br>");
39 */
40 //这里就是执行FileUpload的SaveAs方法保存上传的文件。
41 FUSalBud.SaveAs(FilePath);
42 Response.Write("<br>上传成功!<br>类型:" + FUSalBud.PostedFile.ContentType + " 大小:" + Math.Round((FUSalBud.PostedFile.ContentLength / 1024.0), 2) + " KB");
43 flag = true;
44 //将这个上传到数据库的按钮设为可用。
45 BTUpload.Enabled = true;
46 }
47 catch (Exception ex)
48 {
49 Response.Write("<br>上传失败!" + ex.Message + "<br>");
50 }
51 }
52 }
53 if (!flag)
54 {
55 Response.Write("<br>文件格式不正确<BR/>");
56 }
57
58 //读取文件至GridView
59 /*
60 string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
61 "Extended Properties=Excel 8.0;" +
62 "data source=" + xlsPath;
63 *
64 * 数据提供程序使用Jet,同时需要指定Extended Properties 关键字设置 Excel 特定的属性,不同版本的Excel对应不同的属性值:用于 Extended Properties 值的有效 Excel 版本。
65 对于 Microsoft Excel 8.0 (97)、9.0 (2000) 和 10.0 (2002) 工作簿,请使用 Excel 8.0。
66 对于 Microsoft Excel 5.0 和 7.0 (95) 工作簿,请使用 Excel 5.0。
67 对于 Microsoft Excel 4.0 工作簿,请使用 Excel 4.0。
68 对于 Microsoft Excel 3.0 工作簿,请使用 Excel 3.0。
69 * HDR=Yes,表示Excel文件里的sheet中的第一行数据表示的是字段
70 * IMEX=1,表示采用数据混合的类型。
71 * Extended Properties=\\"Excel 8.0;HDR=Yes;IMEX=1\\";这里面用到了转义字符,因为要加双引号("")。否则报错。
72 */
73 string connExcel = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Extended Properties=\\"Excel 8.0;HDR=Yes;IMEX=1\\";" + "data source=" + FilePath;
74 if (FileNameExtension != "" && FileExtension == ".xls")
75 {
76 //读取Excel的sheet数据。 [Sheet1$]中的Sheet1为Excel中Sheet里的名称。其格式就是写成这样。
77 string SQL = "select * from [Sheet1$]";
78 //以下跟利用SqlClient读取数据库的DATA一样了。不多说了。
79 OleDbConnection conn = new OleDbConnection(connExcel);
80 try
81 {
82 conn.Open();
83 OleDbDataAdapter oda = new OleDbDataAdapter(SQL, conn);
84 DataSet ds = new DataSet();
85 oda.Fill(ds, "Sheet");
86 GridView1.DataSource = ds;
87 GridView1.DataBind();
88 }
89 catch (Exception ex)
90 {
91 Response.Write("<br>读取Excel文件失败: " + ex.Message);
92 }
93 finally
94 {
95 conn.Close();
96 File.Delete(FilePath);
97 }
98 }
99 }
100 else
101 {
102 Response.Write("请选择文件!");
103 }
104 }
读取后,现在就将GridView里的数据写进数据库。在BTUpload的单击事件里写:
1 protected void BTUpload_Click(object sender, EventArgs e)
2 {
3 SqlConnection conn = sharefunctions.GetConnection();
4 StringBuilder sSQL = new StringBuilder("INSERT INTO SisSalesBudget VALUES");
5 sSQL.Append(" ('10',@CmpCode,@YEAR,@Period,@Version,@SalesOrg,@DistChnl,@Division,@SalesOff,@SalesGrp,@BudgetGroup,@CustomerNo,@MtrlNo, ");
6 sSQL.Append(" @Qty,@HL,@ActiveVer,'CFM',@RecUser,CONVERT(VARCHAR(8),GETDATE(),112),CONVERT(VARCHAR(5),GETDATE(),108),@LstUser,GETDATE()) ");
7 string InsertSQL = sSQL.ToString();
8
9 try
10 {
11 conn.Open();
12 }
13 catch (Exception ex)
14 {
15 LabError.Text = "Connection SQLDB Error!" + ex.Message + "<BR/>";
16 }
17 SqlTransaction trans = conn.BeginTransaction();
18 DataSet ds = null;
19 string sMtrlNo = ",";
20 // SqlCommand comd = new SqlCommand(InsertSQL, conn);
21 bool Succeed = true;
22 try
23 {
24 // comd.Transaction = trans;
25 foreach (GridViewRow gr in GridView1.Rows)
26 {
27 //我在这里加上SqlTransaction
28 //注意:我并没有显式释放掉SqlCommand,其实也不知该怎么做好,望高手看点。不过问题暂时看不出。
29 SqlCommand comd = new SqlCommand(InsertSQL, conn,trans);
30 sMtrlNo = gr.Cells[11].Text;
31 ds = SalBudDs.DsMtrlUomChange("10", sMtrlNo, "HL");
32 if (ds.Tables["TabMtrlUom"].Rows.Count > 0)
33 {
34 //Debug
35 //Response.Write(gr.Cells[9].Text + "<br>");
36
37 double BaseQty = Convert.ToDouble(ds.Tables["TabMtrlUom"].Rows[0]["BaseQty"].ToString());
38 double AltQty = Convert.ToDouble(ds.Tables["TabMtrlUom"].Rows[0]["AltQty"].ToString());
39 double ActQty = Convert.ToDouble(gr.Cells[12].Text);
40 double HL = ActQty * (AltQty / BaseQty);
41 comd.Parameters.Add("@CmpCode", SqlDbType.VarChar, 4).Value = gr.Cells[0].Text;
42 comd.Parameters.Add("@YEAR", SqlDbType.VarChar, 4).Value = gr.Cells[1].Text;
43 comd.Parameters.Add("@Period", SqlDbType.VarChar, 4).Value = gr.Cells[2].Text;
44 comd.Parameters.Add("@Version", SqlDbType.Int, 4).Value = Convert.ToInt16(gr.Cells[3].Text);
45 comd.Parameters.Add("@SalesOrg", SqlDbType.VarChar, 4).Value = gr.Cells[4].Text;
46 comd.Parameters.Add("@DistChnl", SqlDbType.VarChar, 2).Value = gr.Cells[5].Text;
47 comd.Parameters.Add("@Division", SqlDbType.VarChar, 2).Value = gr.Cells[6].Text;
48 comd.Parameters.Add("@SalesOff", SqlDbType.VarChar, 4).Value = gr.Cells[7].Text;
49 comd.Parameters.Add("@BudgetGroup", SqlDbType.VarChar, 2).Value = gr.Cells[8].Text;
50 comd.Parameters.Add("@SalesGrp", SqlDbType.VarChar, 3).Value = gr.Cells[9].Text;
51 comd.Parameters.Add("@CustomerNo", SqlDbType.VarChar, 10).Value = gr.Cells[10].Text;
52 comd.Parameters.Add("@MtrlNo", SqlDbType.VarChar, 18).Value = sMtrlNo;
53 comd.Parameters.Add("@Qty", SqlDbType.Float).Value = ActQty;
54 comd.Parameters.Add("@HL", SqlDbType.Float).Value = HL;
55 comd.Parameters.Add("@ActiveVer", SqlDbType.VarChar, 5).Value = gr.Cells[13].Text;
56 comd.Parameters.Add("@RecUser", SqlDbType.VarChar, 20).Value = Session["PmsUserID"].ToString();
57 comd.Parameters.Add("@LstUser", SqlDbType.VarChar, 20).Value = Session["PmsUserID"].ToString();
58 int m = comd.ExecuteNonQuery();
59 if (m == 0)
60 {
61 Succeed = false;
62 }
63 }
64 else
65 {
66 Succeed = false;
67 break;
68 }
69 }
70
71 if (Succeed)
72 {
73 trans.Commit();
74 BTUpload.Enabled = false;
75 LabError.Text = "Insert Data succeed!";
76 }
77 else
78 {
79 Response.Write("The MtrlNo: " + sMtrlNo + " is invalid.<br/>");
80 trans.Rollback();
81 }
82 }
83 catch (Exception ex)
84 {
85 //catch到的错所要回滚的。无论开多少个begintrans,只要一个rollback 就搞定,回到最初状态。但commit trans不是,开多少个,就要commit多少次。
86 //另,commit N次后,如果最后一个的是rollback ,也只会回到最初状态。
87 trans.Rollback();
88 LabError.Text = "Insert Data Error!" + ex.Message + "<BR/>";
89 }
90 finally
91 {
92 //这里就将SqlTransaction释放掉了。只要不出错,Dispose()都不会call Rollback()。
93 trans.Dispose();
94 conn.Close();
95 }
96 }
搞定。
第一次写,肯定会有错的,望见凉。有时间就来。哈哈。。。我要成为高手啊。