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", ));
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);
}

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

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

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 = ; 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 = ;
while (reader.Read())
{
var div = "<div>";
var span1 = "";
var span2 = "";
//读取列头部信息
if (r == )
{
for (var z = ; z < reader.FieldCount; z++)
{
span1 += ("<span>" + reader.GetName(z).ToString() + "&nbsp&nbsp</span>");
}
header += (div + span1 + "</div>");
r = ;
}
//读取值
for (var i = ; 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 = ; 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[]["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列
Object name=table.Rows[]["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[].BeginEdit();//开启行编辑
table.Rows[].SetField("author","无垠");//修改数据
table.Rows[].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();
//……

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框架的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建  ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(5)-前台JqueryEasyUI前台实现

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(5)-前台JqueryEasyUI前台实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)  (1)框架搭建    (2):数据 ...

  4. c#、.net、asp.net、asp 、ado.net、.net framework的区别

    c#:一种编程语言 .net:一种运行环境 asp.net:基于.netFramework框架下的一种开发技术(相对与asp而言,引入了服务器控件,前后台可分,编译型的编程框架) asp:也是.net ...

  5. 感恩回馈,新鲜出炉的《ASP.NET MVC 5框架揭秘》免费赠送

    上次针对<ASP.NET Web API 2框架揭秘>举办了一次评论赠书活动,很多人问我相同的活动要不要针对<ASP.NET MVC 5框架揭秘>(阅读样章)再来一次,为此我向 ...

  6. 《ASP.NET MVC 5框架揭秘》样章发布

    今天算是新作<ASP.NET MVC 5框架揭秘>正式上架销售的日子(目前本书在互动网已经到货),为了让更多适合的朋友们能够阅读此书,同时也避免让不适合的读者误买此书,特将此书的样章发布出 ...

  7. 新作《ASP.NET MVC 5框架揭秘》正式出版

    ASP.NET MVC是一个建立在ASP.NET平台上基于MVC模式的Web开发框架,它提供了一种与Web Form完全不同的开发方式.ASP.NET Web Form借鉴了Windows Form基 ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

随机推荐

  1. 3.django学习

    ##另外一种url配置方法 首先要导入include 要包含blog目录下的urls.py(新建)的文件 从views连接到index

  2. qml: 组件复用

    在编写组件时,使用下面两种方法可以实现组件的复用: import QtQuick 2.0 import QtQuick.Window 2.2 import QtQuick.Controls 1.4 a ...

  3. 常见的Dos命令

    dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录    注意:rd不能删除非空的文件夹,而且只能用于删除文件夹. cd : 进入指定目录 cd.. : 退回到上一级目 ...

  4. mybatis mapper配置

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  5. HDU - 1540 Tunnel Warfare(线段树区间合并)

    https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...

  6. dubbo的具体使用

    dubbo的具体使用: dubbo简介: 1.1.    什么是dubbo 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,急需一个治理 ...

  7. 使用JSX的注意事项

    react中JSX是一种JavaScript + xml语法,用来创建虚拟DOM和声明组件.他可以更好的让我们读.写模板或组件. JSX语法浏览器是不识别的,需要通过babel 来进行转换成浏览器识别 ...

  8. JavaScript 实现一个简单的MVVM前端框架(ES6语法)

    前言 随着前端各大框架的崛起,为我们平时的开发带来了相当的便利,我们不能一直停留在应用层面,今天就自己动手实现一个乞丐版的MVVM小框架 完整代码github地址 效果 html代码 <div ...

  9. java四种权限修饰符(public > protected > (default) > private)

    权限修饰符在哪里可以访问 (default) : 表示什么权限修饰符都不写 位置 public protected (default) private 同一个类 yes yes yes yes 同一个 ...

  10. 用Google Brain的机器学习项目:Magenta,教神经网络学抖音小姐姐作曲。

    先上我们要学习的小姐姐 的美照.. 一.配置环境 1.自己配置环境:python,tensorflow,bazel(编译),java.然后下载magenta(https://github.com/te ...