首页 > 代码库 > ASP.NET - ADO.NET框架

ASP.NET - ADO.NET框架

ADO.NET(ActiveX Data Objects)

ADO.NET是一个COM组件库,用于在使用Microsoft技术的代码中访问数据库。

SQL数据操作类

SqlConnection类(System.Data.SqlClient.SqlConnection)

提供打开数据库的方法。创建此对象,提供数据库连接字符就可以与数据库建立连接,你可以把数据库mdf文件存放在App_Data文件夹里,如果这样做,则vs的服务器资源管理器里会自动添加该数据库的连接。在服务器资源管理器中右击数据库-属性-连接字符串-复制即可。通常与数据库操作有关的代码都应放在using语句块中,这样就不必每次都手动关闭连接并销毁对象了。

属性.property

技术分享
ConnectionTimeout //获取连接超时时间,默认15DataSource//获取当前服务器名称State//连接数据库的状态,值为ConnectionState枚举,可能的值为Open或ClosedServerVersion//返回数据库版本号Database//获取当前打开的数据库名
只读属性.property

方法.method 

技术分享
Open()//打开当前程序与数据库的连接Close()//关闭当前程序与数据库的连接ChangeDatabase(databaseName)//改变当前要连接的数据库Dispose()//销毁自身示例:SqlConnection conn = new SqlConnection();conn.ConnectionString = @"uid=sa;pwd=123456;server=寒食;database=Article";conn.Open();Response.Write(conn.DataSource);conn.Close();//与Access数据库建立连接OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\demo\myWeb\App_Data\test.accdb;Persist Security Info=True");conn.Open();OleDbCommand cmd= conn.CreateCommand();cmd.CommandText = "insert into students(Name,Age)values(@name,@age)";cmd.Parameters.Add(new OleDbParameter("@name", "sam"));cmd.Parameters.Add(new OleDbParameter("@age", 18));int i = cmd.ExecuteNonQuery();Response.Write(i);//自定义数据库连接字符配置节,通过读取配置节获得数据库连接字符<configuration>      <appSettings>            <add key="SQLConnStr" value=http://www.mamicode.com/"uid=sa;pwd=123456;server=寒食;database=Article"/>      </appSettings> </configuration>using System.Configuration;SqlConnection conn = new SqlConnection();string sqlConnStr = ConfigurationManager.AppSettings["SQLConnStr"];conn.ConnectionString = sqlConnStr;conn.Open();Response.Write(conn.DataSource);conn.Close();
方法.method

SqlCommand类(System.Data.SqlClient.SqlCommand)

执行数据库SQL语句或存储过程

属性.property

技术分享
CommandText//配置SQL语句或存储过程的名字CommandType//设置Command对象应执行的命令类型,是SQL语句或是存储过程,配置是一个System.Data.CommandType枚举,可能的值为Text、StoredProcedure、TableDirectCommandTimeout//设置或获取执行命令的超时时间Connection//获取数据库连接对象 
属性.property

方法.method

技术分享
ExecuteScalar()//执行查询并返回首行首列的单个值 //常用于执行统计ExecuteReader()//执行查询并返回一个只读、只进的DataReader类的实例,该实例提供了读取记录的方法ExecuteNonQuery()//执行插入、删除、修改、创建等操作并返回受影响的行数,没有记录被影响则返回-1 Cancel()//取消执行示例:using System.Data.SqlClient;using System.Configuration;protected void Page_Load(object sender, EventArgs e){    SqlConnection conn = new SqlConnection();    string SQLConnStr = ConfigurationManager.AppSettings["SQLConnStr"];    using (conn)    {        conn.ConnectionString = SQLConnStr;        conn.Open();        SqlCommand cmd = new SqlCommand();        cmd.CommandType = System.Data.CommandType.Text;        cmd.CommandText = "select * from Article";        cmd.Connection = conn;        int articleID=int.Parse(cmd.ExecuteScalar().ToString());        Response.Write(articleID);    }}
方法.method

 SqlParameter类(System.Data.SqlClient.SqlParameter)

表示SqlCommand的参数,如果SqlCommand对象需要执行带参数的命令,则使用SqlParameter创建参数。

技术分享
using (conn){    conn.ConnectionString = SQLConnStr;    conn.Open();    SqlCommand cmd = new SqlCommand();    cmd.CommandType = System.Data.CommandType.StoredProcedure;    cmd.CommandText = "selectArticle";//存储过程名    SqlParameter[] param = new SqlParameter[]    {        new SqlParameter("@AuthorName","寒食"),//参数名、参数值        new SqlParameter("@PostDate","2016-06-20")    };    foreach (SqlParameter p in param)    {        cmd.Parameters.Add(p);    }    cmd.Connection = conn;    string ID = cmd.ExecuteScalar().ToString();    Response.Write(ID);}
View Code

存储过程默认会自动返回int类型的值,该值代表了增删改查受影响的行数,但它只会返回一个数据,如果你需要存储过程返回多个信息,你可以在存储过程中创建OutPut类型的变量,声明为OutPut的变量一旦得到值,它会自动被返回出去,服务端传递一个ref变量的参数即可接收类型为OutPut的变量的值。但这个值必须是int类型,因为存储过程不能返回字符。

技术分享
SqlParameter p = new SqlParameter("@Counts", 0);        p.Direction = System.Data.ParameterDirection.Output;//表示该参数是输出参数,存储过程将OutPut的变量返回给该参数cmd.Parameters.Add(p);cmd.Connection = conn;string ID = cmd.ExecuteScalar().ToString();int count = (int)cmd.Parameters[0].Value;//存储过程执行后会将OutPut的变量装入索引为0的参数里,现在就可以取出来
View Code

SqlDataReader类(System.Data.SqlClient.SqlDataReader)

存储记录,并提供领导Read方法,该方法类似于游标、指针,当指针指向一条记录时,Reader会存储这条记录,通过字段索引的形式读取字段的值。此对象通常由SqlCommand对象的ExecuteReader()方法返回一个SqlDataReader实例,也可结合CommandBuilder进行使用。

属性.property

技术分享
HasRows//结果集是否有数据FieldCount//读取当前行的列总数IsClosed//当前的Reader对象是否已关闭RecordsAffected//获取增删改查后受影响的行数
属性.property

方法.method

技术分享
GetString(FieldIndex)//根据字段索引获取该字段的字符值GetInt32(FieldIndex)//根据字段索引获取该字段的int值 GetName(FieldIndex)//根据字段索引获取列的字段名GetOrdinal(fieldName)//根据字段名获取其对应的索引Read()//推进以使其指向下一条记录,同时如果存在记录则返回true,此方法并不自动推进,需要用循环使其推进指针。当第一次调用Read时会指向第一条记录示例:while (Reader.Read()){    for (int i = 0; i < Reader.FieldCount; i++)    {        Response.Write(Reader[i].ToString());    }}示例:打印表格数据using (conn){    string SQLConnStr = ConfigurationManager.AppSettings["SQLConnStr"];    conn.ConnectionString = SQLConnStr;    conn.Open();    SqlCommand CMD = new SqlCommand();    CMD.CommandType = System.Data.CommandType.Text;    CMD.CommandText = "select Author,Title,PostDate from Article";    CMD.Connection = conn;    SqlDataReader reader = CMD.ExecuteReader();    var header = "";    var msg = "";    var r = 0;    while (reader.Read())    {        var div = "<div>";        var span1 = "";        var span2 = "";        //读取列头部信息        if (r == 0)        {            for (var z = 0; z < reader.FieldCount; z++)            {                span1 += ("<span>" + reader.GetName(z).ToString() + "&nbsp&nbsp</span>");            }            header += (div + span1 + "</div>");            r = 1;        }        //读取值        for (var i = 0; i < reader.FieldCount; i++)        {            span2 += ("<span>" + reader[i].ToString() + "&nbsp&nbsp</span>");        }        msg += (div += span2 + "</div>");    }    Response.Write(header+msg);}示例:读取null值//表可能有null值,需要做判断,否则会抛出异常if (Reader[i] == DBNull.Value){    //……}NextResult()//推进指针到下一张表,成功推进到另一张表则返回true示例:cmd.CommandText = "select * from 学员 ; select * from 成绩 ; select * from 地址"; SqlDataReader Reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);do{    while (Reader.Read())    {        for (int i = 0; i < Reader.FieldCount; i++)        {            if (Reader[i] == DBNull.Value)            {                //……            }            else            {               //如果有数据……            }                                }    }} while (Reader.NextResult());Close()//关闭指针
方法.method

 SqlDataAdapter(System.Data.SqlClient.SqlDataAdapter)

起数据桥接的作用,如果不使用SqlDataReader读取数据,则可以使用此对象与数据库建立桥接,它将数据读取到DataSet(虚拟数据缓存)中,然后关闭桥接,接着你可以在于数据库断开连接的情况下从DataSet里读取数据而不必再和数据库进行交互。数据量较小的情况下可以考虑使用SqlDataAdapter,但该对象会将数据填充到DataSet,这会占用客户机内存。所以,在数据量大的情况下还是应考虑使用DataReader。

技术分享

属性.property

技术分享
SelectCommand //指定要使用的SqlCommand对象。所有要执行的select类型的SQL命令、命令的参数都通过此属性进行配置示例:SqlCommand cmd = new SqlCommand();SqlDataAdapter dap = new SqlDataAdapter(); dap.SelectCommand =cmddap.SelectCommand.CommandText = "select * from 产品";示例:查询多张表dap.SelectCommand.CommandText = "select * from Product";dap.Fill(ds, "产品");//接下来更改SqlDataAdapter的查询语句即可查询另一张表dap.SelectCommand.CommandText = "select * from ProductType";dap.Fill(ds,"产品类型"); //产品类型表被查询到InsertCommand//指定要使用的SqlCommand对象。所有要执行的insert into类型的SQL命令、命令的参数都通过此属性进行配置UpdateCommand//指定要使用的SqlCommand对象。所有要执行的update类型的SQL命令、命令的参数都通过此属性进行配置示例:ds.Tables["成绩单"].Rows[2]["name"] = "lily";//同时更新虚拟的DataSet和真实数据库dapter.Update(ds, "成绩单");DeleteCommand//指定要使用的SqlCommand对象。所有要执行的delete类型的SQL命令、命令的参数都通过此属性进行配置
属性.property

方法.method

技术分享
Fill(DataSetObj,dataSetTableName)//DataSetObj:DataSet对象//dataSetTableName:DataSet中的表名,如果没有此表则创建它//将数据库表记录填充到DataSet中,//返回int类型的值 >0表示装入了数据 <0表示是张空表//填充后,在DataSet里会生成一张虚拟的表 示例:SqlConnection conn = new SqlConnection();conn.ConnectionString = ConfigurationManager.AppSettings["SQLConnStr"];conn.Open();SqlCommand cmd = new SqlCommand();cmd.Connection = conn;cmd.CommandType = CommandType.StoredProcedure;cmd.CommandText = "TestProc";SqlDataAdapter dap = new SqlDataAdapter(cmd);dap.SelectCommand =cmdDataSet ds = new DataSet();dap.Fill(ds, "UserMsg");
方法.method

DataSet(System.Data.DataSet)

DataSet类相当于虚拟数据库,它可以保存从SqlDataAdapter填充进来的N张记录,在与服务器断开的情况下依然可以访问DataSet。

属性与方法.property&method 

技术分享
Tables//获取当前虚拟内存中的DataTable集合Relation//获取当前虚拟内存中的DataTable之间的关系集合getChanges()//获取结果集,通常用于执行update操作之后获取受影响的记录集合
属性与方法.property&method

DataTable(System.Data.DataTable)

表示一张数据表,可以手动创建虚拟数据表,它通常是DataSet和DataView所存储的数据对象。

属性与方法.property&method 

技术分享
Rows//获取表的行集合对象(DataRowCollection),通常用于读取字段值DataRowCollection list = table.Rows;//获取所有行Object r= table.Rows[0][1];//获取第0行中的第1列Object name=table.Rows[0]["name"];//获取第0行中的name列Columns//获取表的列集合对象(DataColumnCollection),通常用于设置字段名Delete()//从DataTable的Rows集合中删除某行NewRow()//在DataTable的末尾添加一个新行并返回新行DataRowCollectionObj.Add(dataRowObj)//在表的末尾插入新行,此方法要求DataTable的Rows集合进行调用。通常不需要new一个DataRow而是靠DataTable的NewRow()创建新行,并通过DataRowCollectionObj的Add()方法将新行添加到表的末尾DataColumnCollectionObj.Add(dataColumnObj)//在表的末尾创建新的列,此方法要求DataTable的Columns集合进行调用。通常不需要new一个DataColumn而是靠DataTable的DataColumnCollectionObj的Add()方法直接创建新列示例:DataTable table = new DataTable("Article");//创建表table.Columns.Add("author");//创建新列table.Columns.Add("title");//创建新列DataRow row = table.NewRow();//创建新行row.SetField("author", "寒食");//在新行插入值row.SetField("title", "哲学");//在新行插入值table.Rows.Add(row);//将新行添加到行集合            string msg = string.Empty;foreach (DataRow record in table.Rows){    msg+="<div>" +record["author"].ToString() +record["title"]+"</div>";}Response.Write(msg);示例:编辑行table.Rows[0].BeginEdit();//开启行编辑table.Rows[0].SetField("author","无垠");//修改数据table.Rows[0].EndEdit();//关闭行编辑//DatasetObj.AcceptChanges();//提交所有更改,如果DataTable是存在于DataSet中则需要调用AcceptChanges保存更改
属性与方法.property&method

通用数据访问的兼容性实现

如果无法确定项目最终使用的何种类型的数据库时,使用Sqlxxx等一系列的数据库操作类就会显得不合时宜。到时候可能会修改大量的程序文件。在不确定使用何种数据库的情况下,你可以使用两种方法来创建具备兼容性的数据库操作类。

1.IDbXXX统一接口(System.Ddata.IDbXXX)

数据库操作类都实现了ADO.NET框架的数据库操作的统一接口,利用接口的多态性,你可以将数据库操作类统一为接口类型,比如SqlConnection(MS数据库的操作类)、OracleConnection(Oracle数据库的操作类)、OleDbConnection(Access数据库的操作类)。

1.IDbConnection

2.IDbCommand

3.IDbDataParameter

4.IDataReader

5.IDbDataAdapter

技术分享
string ProviderName = "Access";IDbConnection conn=null;if (ProviderName == "Access"){    conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\demo\myWeb\App_Data\test.accdb;Persist Security Info=True");}else if(ProviderName=="SqlServer"){    conn = new SqlConnection(@"Data Source=.;Initial Catalog=gssMs;Persist Security Info=True;User ID=sa;Password=123");}conn.Open();IDbCommand cmd = conn.CreateCommand();//……
View Code

2.DbProviderFactory抽象工厂模式(System.Data.Common.DbProviderFactory)

此类不提供构造函数,它的实例由DbProviderFactories.GetFactory()创建,参数是数据库提供程序的类型。有以下类可以协同完成数据库操作。

1.DbConnection 

2.DbCommand

3.DbParameter

4.DbDataReader

5.DbDataAdapter 

技术分享
<appSettings>    <add key="factoryType" value="System.Data.SqlClient"/>    <add key="SQLConnStr" value="uid=sa;pwd=123456;server=寒食;database=Article"/></appSettings>
配置节
技术分享
using System.Configuration;using System.Data;using System.Data.Common;DbProviderFactory factories = DbProviderFactories.GetFactory(ConfigurationManager.AppSettings["factoryType"]);DbConnection conn = factories.CreateConnection();conn.ConnectionString = ConfigurationManager.AppSettings["SQLConnStr"];conn.Open();Response.Write(conn.State);//所有数据库操作实例都靠DbProviderFactory对象的CreateXXX()方法创建示例:DbConnection conn = factories.CreateConnection();DbCommand CMD = factories.CreateCommand();DbParameter param = factories.CreateParameter();DbDataAdapter dap = factories.CreateDataAdapter();
创建实例

 

ASP.NET - 学习总目录

ASP.NET - ADO.NET框架