ADO.NET
在线对象:
Connection 用来和数据库建立连接
Command 表示执行的数据操作命令
Parameter 表示数据操作命令中的参数
DataReader 用来以只读只进方式读取数据
Transaction用来实现事务
DataAdapter用来为数据容器加载数据和把更新后的数据传回数据库
离线对象:
DataSet 数据容器,就好像一个数据库,容纳多个DataTable和关系
DataTable 数据容器,就好像一个数据表,又DataRow和DataColunn构成
DataRow 代表DataTable中的一行记录
DataColumn 代表DataTable的列,就好像字段
DataView 和数据库的视图差不多,用来为一个DataTable建立多种视图
DataRelation 表示各个DataTable之间的关系,并提供浏览父表记录和子表记录的方式
Constraint 表示DataTable的主键约束和外键约束
二、命名空间
Using System.Data
Using System.Data.SqlClient
Using System.Configuration;
三、基本链接
//创建数据链接对象
SqlConnection sqlcon = new SqlConnection("server=.;dataBase=adoTest;uid=sa;pwd=10055154");
//打开数据库
sqlcon.Open();
//创建Sql语句
string sqlString = "select * from t1";
//创建命名语句
SqlCommand sqlCmd = new SqlCommand(sqlString,sqlcon);
//创建数据集
SqlDataAdapter sdr = new SqlDataAdapter(sqlCmd);
DataSet ds = new DataSet();
sdr.Fill(ds);
//关闭数据库
sqlcon.Close();
GridView1.DataSource = ds;
GridView1.DataBind();
四、操作数据库
关键字:
ExecuteReader():返回一行或多行。多用于SELECT查询数据
ExecuteNonQuery():对Connection执行SQL语句,并返回受影响的行数(int),多用于INSERT,UPDATE,DELETE,CREATE等操作
ExecuteScalar():返回单个值。返回结果集中第一行的第一列。忽略额外的列或行
1、查
SqlConnection con = new SqlConnection("server=.;dataBase=adoTest;uid=sa;pwd=10055154");
con.Open();
SqlCommand cmd = new SqlCommand("select * from t1 where address = @address",con);
cmd.Parameters.AddWithValue("@address",DropDownList1.SelectedItem.Value);
SqlDataReader dr = cmd.ExecuteReader();//******重点******//
GridView1.DataSource = dr;
GridView1.DataBind();
2、增、删、改
SqlConnection sqlcon = new SqlConnection("server=.;dataBase=adoTest;uid=sa;pwd=10055154");
sqlcon.Open();
SqlCommand cmd = new SqlCommand("update t1 set age = 19 where name = @name",sqlcon); //********增、删、改的不同只在于Sql语句的不同*****//
cmd.Parameters.AddWithValue("@name","张三");
cmd.ExecuteNonQuery();
sqlcon.Close();
ClientScript.RegisterClientScriptBlock(this.GetType(), "提示", "alert('修改成功');", true);
3、数据库链接状态判定
if (state == "Open")
{
Sqlcon.Close();//关闭数据库
Sqlcon.Dispose();//释放连接占用的资源
MessageBox.Show("连接已成功断开");
}
else
{
MessageBox.Show("当前连接为关闭状态");
}
五、安全性
1、参数化SQL语句(防SQL注入式攻击)
SqlConnection sqlcon = new SqlConnection("server=.;dataBase=adoTest;uid=sa;pwd=10055154");
sqlcon.Open();
SqlCommand cmd = new SqlCommand("select * from t1 where id>@tj",sqlcon);
cmd.Parameters.AddWithValue("@tj",TextBox7.Text);
/*
或:
cmd.Parameters.Add("@tj", SqlDbType.Int);
cmd.Parameters["@tj"].Value = TextBox7.Text;
*/
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
/// <summary>
/// 获取排序分页数据
/// </summary>
/// <param name="start">起始行</param>
/// <param name="end">结束行</param>
/// <param name="categoryId">条件表达式</param>
/// <param name="orderby">排序表达式</param>
/// <returns></returns>
public DataSet GetPageList(int start, int end, int categoryId,string orderby)
{
string sql = "select * from(select row_number()over(order by {1})as num,* from Books {0}) as t where num>=@start and num<=@end";
sql = string.Format(sql, categoryId != 0 ? " where CategoryId=@CategoryId" : "",(orderby!=""&&orderby!=null)?orderby:"id");
SqlParameter[] pars ={
new SqlParameter("@start",start),
new SqlParameter("@end",end),
new SqlParameter("@CategoryId",categoryId)
};
return DbHelperSQL.Query(sql, pars);
//List<SqlParameter> listP = new List<SqlParameter>();
//listP.Add(new SqlParameter("@start", SqlDbType.Int) { Value = start });
//listP.Add(new SqlParameter("@end", SqlDbType.Int) { Value = end });
//listP.Add(new SqlParameter("@CategoryId", SqlDbType.Int) { Value = categoryId });
//return DbHelperSQL.Query(sql, listP.ToArray());
}
2、事务处理(一串操作不成功则返回最初状态)
事务处理的主要特征是,任务要么全部完成,要么都不完成。在写入一些记录时,要么写入所有的记录,要么什么都不写入。如果在写入一个记录时出现了失败,那么在事务处理中已写入的其他数据就会回滚。事务可能由很多单个任务构成。
操作过程:
1) 创建事务
2) 指定SQL语句为事务
3) Try当所有操作都正确完成时:事务.commit()
4) Ctrch当有任何错务时:事务.RollBack();
SqlConnection sqlcon = new SqlConnection("server=.;dataBase=adoTest;uid=sa;pwd=10055154");
sqlcon.Open();
//创建事务
SqlTransaction myTrans = sqlcon.BeginTransaction();
SqlCommand cmd = new SqlCommand("update t1 set age = 19 where name = @name",sqlcon);
cmd.Parameters.AddWithValue("@name","张三");
//指定SQL语句为事务
cmd.Transaction = myTrans;
try
{
cmd.ExecuteNonQuery();
myTrans.Commit();//提交事务
ClientScript.RegisterClientScriptBlock(this.GetType(), "提示", "alert('修改成功');", true);
}
catch (Exception ex)
{
myTrans.Rollback();//回省滚事务
ClientScript.RegisterClientScriptBlock(this.GetType(),"提示","alert('出错,事务回滚');",true);
}
sqlcon.Close();
3、存储过程
1)执行不带返回参数(Input)的存储过程
A、在数据库中编写存储过程
create procedure procTest1
(
@id int
)
as
begin
select * from t1 where id >=@id
end
go
B、创建并初始SqlCommand对象
SqlConnection con = new SqlConnection("server=.;dataBase=adoTest;uid=sa;pwd=10055154");
con.Open();
SqlCommand cmd = new SqlCommand();
//指定调用哪个存储过程
cmd.CommandText = "procTest1";
//指定SQL命令类型是存储过程,默认为SQL语句
cmd.CommandType = CommandType.StoredProcedure;
//建立连接
cmd.Connection = con;
C、向SqlCommand对象添加存储过程参数
//指定参数对象
SqlParameter param = new SqlParameter();
//设置该参数对象的值
cmd.Parameters.AddWithValue("@id",Convert.ToInt32(TextBox1.Text.Trim()));
D、执行命令
//执行命令
SqlDataReader dr = cmd.ExecuteReader();
GridView1.DataSource = dr;
GridView1.DataBind();
2)执行带返回参数(output)的存储过程
A、SQL存储过程
create procedure proc2
(
@address nchar(20),
@value int output
)
as
begin
select @value = (select COUNT(*) from t1 where address=@address)
end
B、在VS中调用
SqlConnection con = new SqlConnection("server=.;dataBase=adoTest;uid=sa;pwd=10055154");
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "proc2";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.Parameters.AddWithValue("@address",DropDownList1.SelectedItem.Value);
SqlParameter spr = new SqlParameter();
spr.ParameterName = "@value";
spr.SqlDbType = SqlDbType.Int;
spr.Direction = ParameterDirection.Output;
cmd.Parameters.Add(spr);
SqlDataReader sda = cmd.ExecuteReader();
GridView1.DataSource = sda;
GridView1.DataBind();
con.Close();
Label1.Text = spr.Value.ToString();
六、数据库链接时间设定
默认情况下连接数据库的超时时间是15秒,我们可以通过调整连接字符串的方法来改变只读的ConnectionTimeout属性。只需在初始化SqlConnection类的变量时加上一句: Connection Timeout= 2;即可将超时时间调为2秒。
七、web.config配置及调用
1、数据库链接
配置:<connectionStrings>
<addname="sqloledb"connectionString="server = .;Database=10msg;uid=sa;pwd=10055154" />
</connectionStrings>
调用: public SqlConnection GetConnection()
{
try
{
returnnew SqlConnection(ConfigurationManager.AppSettings["sqloledb"].ToString());
}
catch (Exception ex)
{
ClientScript.RegisterClientScriptBlock(this.GetType(),"提示","alert('链接出错');",true);
}
}
获取类中:SqlConnection mycon = GetConnection();
2、页面访问异常
<system.web>
<customErrorsmode="On">
<errorstatusCode="404"redirect ="404.aspx"/>
</customErrors>
</system.web>
说明:
1. mode:表示什么时候显示错误信息,共三种状态:
on:表示始终显示自定义的信息。此时跳转到接收出错页面显示页
Off:表示始终显示详细的asp.net错误信息。此时出错出显示哪行出错等详细信息。
RemoteOnly:表示只对不在本地Web服务器上运行的用户显示自定义信息。
2. statusCode:指明错误状态码,指明一种特定的出错状态。如:404
3. redirect:出错时重定向的URL。
八、GridView与ADO.NET
1、一键更新数据
privatevoid btnShowData_Click(object sender,EventArgs e)
{
//用此语句,不能实现对设有主外键及有多表级联更新的表操作
// 创建一个与查询数据一样的SqlDataAdapter对象,并且保证要有主键
string connStr =ConfigurationManager.ConnectionStrings["adb"].ConnectionString;
string sqlStr ="select * from Student";
DataSet ds = new System.Data.DataSet();
using (SqlDataAdapter sda =new SqlDataAdapter(sqlStr,connStr))
{
//自动生成表单,实现对DataSet的更改与对应的数据库相关联
SqlCommandBuilder scb = new SqlCommandBuilder(sda); //**核心**//
sda.Update(dgvData.DataSourceas DataTable); //**核心**//
}
}
1、GridView美化、绑定、与日期格式化
<RowStyleBackColor="#EFF3FB"/>
<Columns>
<asp:BoundFieldDataField="id" HeaderText="编号"/>
<asp:HyperLinkFieldDataTextField="标题"HeaderText="标题"NavigateUrl="~/gl/gxxw.aspx?id={id}"
DataNavigateUrlFields="id"DataNavigateUrlFormatString="gxxw.aspx?id={0}"/>
<asp:BoundFieldDataField="发布日期"HeaderText="发布日期"SortExpression="发布日期"DataFormatString="{0:d}"/>
<asp:BoundFieldDataField="类别"HeaderText="类别"/>
<asp:HyperLinkFieldHeaderText="更新"NavigateUrl="~/gl/gxxw.aspx?id={id}"Text="更新"
DataNavigateUrlFields="id"DataNavigateUrlFormatString="gxxw.aspx?id={0}"/>
<asp:CommandFieldHeaderText="删除"ShowDeleteButton="True"/>
</Columns>
<FooterStyleBackColor="#507CD1"Font-Bold="True" ForeColor="White" />
效果图: