标签: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
//获取当前打开的数据库名
方法.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();
SqlCommand类(System.Data.SqlClient.SqlCommand)
执行数据库SQL语句或存储过程
属性.property
CommandText
//配置SQL语句或存储过程的名字
CommandType
//设置Command对象应执行的命令类型,是SQL语句或是存储过程,配置是一个System.Data.CommandType枚举,可能的值为Text、StoredProcedure、TableDirect
CommandTimeout
//设置或获取执行命令的超时时间
Connection
//获取数据库连接对象
方法.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);
}
}
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", 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的参数里,现在就可以取出来
SqlDataReader类(System.Data.SqlClient.SqlDataReader)
存储记录,并提供领导Read方法,该方法类似于游标、指针,当指针指向一条记录时,Reader会存储这条记录,通过字段索引的形式读取字段的值。此对象通常由SqlCommand对象的ExecuteReader()方法返回一个SqlDataReader实例,也可结合CommandBuilder进行使用。
属性.property
HasRows
//结果集是否有数据
FieldCount
//读取当前行的列总数
IsClosed
//当前的Reader对象是否已关闭
RecordsAffected
//获取增删改查后受影响的行数
方法.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() + "  </span>");
}
header += (div + span1 + "</div>");
r = 1;
}
//读取值
for (var i = 0; i < reader.FieldCount; i++)
{
span2 += ("<span>" + reader[i].ToString() + "  </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()
//关闭指针
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命令、命令的参数都通过此属性进行配置
方法.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");
DataSet(System.Data.DataSet)
DataSet类相当于虚拟数据库,它可以保存从SqlDataAdapter填充进来的N张记录,在与服务器断开的情况下依然可以访问DataSet。
属性与方法.property&method
Tables
//获取当前虚拟内存中的DataTable集合
Relation
//获取当前虚拟内存中的DataTable之间的关系集合
getChanges()
//获取结果集,通常用于执行update操作之后获取受影响的记录集合
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保存更改
通用数据访问的兼容性实现
如果无法确定项目最终使用的何种类型的数据库时,使用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();
标签:ons dsa 桥接 edit 通过 parse getname stat manage
原文地址:http://www.cnblogs.com/myrocknroll/p/7223430.html