日期:2014-05-20 浏览次数:20895 次
System.Data.EntityClient
EntityClient 提供程序使用存储特定的 ADO.NET 数据提供程序类和映射元数据与实体数据模型进行交互。 EntityClient 首先将对概念性实体执行的操作转换为对物理数据源执行的操作。 该提供程序将从物理数据源返回的结果集转换为概念性实体。
?
参考 MSDN :
?
EntityConnection 、 EntityCommand 、 EntityDataReader 使用
为了避免无意使对象(如 System.Data.Common.CommandTrees 和 ObjectContext )与其元数据失去同步, EntityConnection 必须锁定对象的元数据。锁定元数据后,不允许对连接字符串做出任何更改。
?
下面是锁定元数据的两种方案:
·??? EntityConnection 实例通过默认的构造函数或接受连接字符串的 EntityConnection(String) 构造函数进行构造。 在任何一种情况下,连接字符串可能在打开连接前进行多次更改。 调用 [M:System.Data.EntityClient.EntityConnection.Open()] 或 [M:System.Data.EntityClient.EntityConnection.GetMetadataWorkspace()] 锁定元数据。
·??? EntityConnection 实例通过 EntityConnection(MetadataWorkspace, DbConnection) 构造函数进行构造,此构造函数接受 MetadataWorkspace 和 DbConnection 。 在这种情况下,元数据在构造时锁定。 不允许对连接字符串做出任何更改。
?
加载元数据后, EntityConnection 验证概念性模型、存储模型和映射文件是否全部存在。
?
代码片断:
//string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["CSharpTestEntities"].Conne
//CSharpTestEntities edm = new CSharpTestEntities();
//string connStr = edm.Connection.ConnectionString;
string connStr = "name = CSharpTestEntities" ;?? // 这三种方法都可以获取连接字符串
using (EntityConnection conn = new EntityConnection(connStr) )
{
??? string sqlStr = "select value u from CSharpTestEntities.Users as u order by u.UserID desc" ;
?
??? conn.Open();
??? EntityCommand ecmd = new EntityCommand (sqlStr, conn);
??? EntityDataReader edr = ecmd.ExecuteReader(CommandBehavior .SequentialAccess);
?
??? if (edr.Read())
??? {
??????? Console .WriteLine(edr["UserID" ]);?? // 输出第一条
??????? Console .WriteLine(edr[1]); // 如果使用SequentialAccess则需按顺序访问列,否则将抛异常,edr[0]出错。
??? }
??? while (edr.Read())
??? {
??????? Console .WriteLine(edr["UserID" ]);?? // 接着从第二条开始
?? ?????Console .WriteLine(edr[1]);
??? }
??? Console .WriteLine(ecmd.ToTraceString());
}
注:EntityCommand继承自DbCommand,所以也包括ExecuteDbDataReader、 ExecuteNonQuery 、 ExecuteReader 、 ExecuteScalar等常用方法。
?
EntityParameter 使用
代码片断:
#region EntityParameter 参数化传递
//string sqlStr = "select value u from CSharpTestEntities.Users as u order by u.UserID desc skip @start limit @end";
//conn.Open();
//EntityCommand ecmd = new EntityCommand(sqlStr, conn);
?
#region 方法1
EntityParameter p1 = new EntityParameter ("start" , DbType .Int32);
p1.Value = 2;
EntityParameter p2 = new EntityParameter ("end" , DbType .Int32);
p2.Value = 8;
ecmd.Parameters.Add(p1);
ecmd.Parameters.Add(p2);
#endregion
?
#region 方法2
ecmd.Parameters.AddWithValue("start" , 0);
ecmd.Parameters.AddWithValue("end" , 8);
#endregion
?
EntityConnectionStringBuilder 使用
代码片断:
#region EntityConnectionStringBuilder 创建连接
EntityConnectionStringBuilder esb = new ?EntityConnectionStringBuilder ();
esb.Provider = "System.Data.SqlClient" ;
esb.Metadata = @"res://*/CSharpTestEF.csdl|res://*/CSharpTestEF.ssdl|res://*/CSharpTestEF.msl" ;
esb.ProviderConnectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=CSharpTest;Integrated Security=True;MultipleActiveResultSets=True" ;
EntityConnection econn = new EntityConnection (esb.ConnectionString);
#endregion
?
补充:
#region CommandBehavior 枚举
/*
需要注意的是:CommandBehavior.SequentialAccess;这个地方。不同的枚举项,对查询会有不同影响。枚举如下:
Default 此查询可能返回多个结果集。在功能上等效于调用 ExecuteReader()。
SingleResult 查询返回一个结果集。
SchemaOnly 查询仅返回列信息。
KeyInfo 此查询返回列和主键信息。
SingleRow 查询应返回一行。
SequentialAccess 提供一种方法,以便 DataReader 处理包含带有大二进制值的列的行。
CloseConnection 在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。
*/
#endregion