码迷,mamicode.com
首页 > Web开发 > 详细

ASP.NET - ADO.NET框架

时间:2017-07-25 10:27:32      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:ons   dsa   桥接   edit   通过   parse   getname   stat   manage   

ADO.NET(ActiveX Data Objects)

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

SQL数据操作类

SqlConnection类(System.Data.SqlClient.SqlConnection)

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

属性.property

技术分享
ConnectionTimeout 
//获取连接超时时间,默认15

DataSource
//获取当前服务器名称

State
//连接数据库的状态,值为ConnectionState枚举,可能的值为Open或Closed

ServerVersion
//返回数据库版本号

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="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、TableDirect

CommandTimeout
//设置或获取执行命令的超时时间

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 =cmd
dap.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 =cmd
DataSet 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框架

标签:ons   dsa   桥接   edit   通过   parse   getname   stat   manage   

原文地址:http://www.cnblogs.com/myrocknroll/p/7223430.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!