知识目标:
• 复习Connection、Command、DataReader等对象的用法
• using语句的使用
• 学习对象的重复使用
• 学习使用SqlTransaction对象启动事务
释放对象占用资源:
using(SqlConnection cnn = new ...)
{
}
不用写Close()和Dispose()方法;
SqlTransaction对象有回滚事件,为在执行中途出错的程序增加补救措施,减少程序冗余;
今天简单的学习了一下向数据库导入数据,涉及到一些文件操作问题;以下是一段利用DataGrid(利用GridView总出错,暂时没弄出来)从数据库导出数据岛Excel中:
弄出来了,换成GridView控件时, 解决办法:
1.修改web.config(不推荐)<pages enableEventValidation ="false" ></pages>
2.直接在导出Execl的页面修改
<%@ Page Language="C#" EnableEventValidation = "false" AutoEventWireup="true"
CodeFile="ExportGridView.aspx.cs" Inherits="ExportGridView" %>
HTML代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:datagrid id="DataGrid1" runat="server">
<Columns>
<asp:BoundColumn></asp:BoundColumn>
</Columns>
</asp:datagrid>
<%-- <asp:GridView ID="GridView1" runat="server">
</asp:GridView>--%>
<br />
<asp:Label ID="Label1" runat="server" Text="文件名:"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="输出到Excel"
οnclick="Button1_Click" />
</div>
</form>
</body>
</html>
CS代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
public partial class _Default : System.Web.UI.Page
{
//protected System.Web.UI.WebControls.Button Button1;
//protected System.Web.UI.WebControls.DataGrid DataGrid1;
//protected System.Web.UI.WebControls.TextBox TextBox1;
//protected System.Web.UI.WebControls.Label Label1;
private DataSet myDS = new DataSet();
protected void Page_Load(object sender, EventArgs e)
{
Data_Load();//调用方法填充表格
}
protected void Button1_Click(object sender, EventArgs e)
{
if (this.TextBox1.Text == "")
{
Response.Write("<SCRIPT language=javascript>");
Response.Write("window.alert('请输入文件名');");
Response.Write("</SCRIPT>");
}
else
{
Response.Clear();
Response.Buffer = true;
Response.Charset = "UTF-8";//"GB2312"; //设置了类型为中文防止乱码的出现
//如果使用DataGrid时,类型设置为UTF-8,防止中文出现乱码
//如果使用GridView控件时,类型设置为GB2312,防止中文出现乱码
Response.AppendHeader("Content-Disposition", "attachment;filename=" + TextBox1.Text + ".xls"); //定义输出文件和文件名
Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");//设置输出流为简体中文
Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。
this.EnableViewState = false;
System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN", true);
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad);
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
this.DataGrid1.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
}
}
/// <summary>
/// 创建数据源
/// </summary>
/// <returns>datagrid</returns>
private void Data_Load()
{
//数据库连接字符串Catalog为指定的数据库名称,DataSource为要连接的SQL服务器名称
string myConn = @"data source=.\SQLEXPRESS;initial catalog=bydticket;integrated security=true";
//查询字符串
string mySQLstr = "SELECT * FROM Users";
//连接数据库操作
SqlConnection myConnection = new SqlConnection(myConn);
//执行SQL语句操作
SqlDataAdapter myDataAdapter = new SqlDataAdapter(mySQLstr, myConnection);
//打开数据库
myConnection.Open();
//向DataSet填充数据,填充数据库服务器中bydticket库中的Users表
myDataAdapter.Fill(myDS, "Users");
//向DastaGrid填充数据
this.DataGrid1.DataSource = myDS;
this.DataGrid1.DataBind();
}
}
可以实现点击下载;
*:以前一直以为
SqlCommand cmd = new SqlCommand("select * from RegiserLogin where UserName='"+this.Text1.Value+"'", con);
这种形式执行效率高,代码量少。
今天知道了这种写法容易被“注入攻击”!
可以使用SqlParameter添加数据安全性高点!
在逐渐的学习当中会发现很多新方法,要学会总结其中的优缺点,并且代码的执行效率和安全性问题要严格注意。不同的代码书写方式执行效率可能相差好几倍~