数据访问组件
一个开源的数据访问组件。
引言
顾名思义,它是一个数据访问组件。 它提供了一个类库和一个工具。 在 .NET 项目中使用它可以使数据访问更容易。
它涵盖
- 支持多种类型的数据库
- 以 DataSet、DataTable 和数据对象的形式提供数据
- 执行 SQL 脚本和存储过程
- 条件表达式
- SQL 的基本功能,例如
MAX
、MIN
在查询中得到支持 - 数据对象代码和 XML 文件生成器
使用代码
基本函数
- 使用 "
EntitiesGenerator
" 工具生成一个实体项目。
参考博客 如何使用 "Entities Generator" 工具创建实体项目。 - 将名为 "connection.config" 的连接配置文件添加到应用程序项目的基本路径中,上下文的格式应如下所示:
<?xml version="1.0" encoding="utf-8" ?> <connections> <connection databaseType="SQL"> Data Source=.\SQLEXPRESS;AttachDbFilename="|DataDirectory|Database1.mdf"; Integrated Security=True;User Instance=True </connection> </connections>
- 如果我们有一个名为 "
Issue
" 的实体对象类,可以使用以下代码将其插入到数据库中。RaisingStudio.Data.Providers.DataContext dc = new RaisingStudio.Data.Providers.DataContext(); dc.Insert<Issue>(issue);
- 更新一个对象。
dc.Update<Issue>(issue);
- 要删除一个对象,我们可以将实体对象作为参数给出,或者只给出其键值。
dc.Delete<Issue>(issue);
或
dc.Delete<Issue>(issueID);
- 要查询对象,我们可以通过 3 种不同的方法获得三种结果:
IEnumerable<T>
、IList<T>
或DataTable
。IEnumerable<Issue> query = dc.Query<Issue>(); foreach(Issue issue in query) { } IList<Issue> issueList = dc.QueryForList<Issue>();
并且我们可以将条件表达式与这些查询方法一起使用
DataTable dataTable = dc.QueryForDataTable<Issue>(Issue._.IssueID > 1);
- 查询一个对象,我们可以使用
GetData()
方法,传入一个带有键值的对象,或者只传入键值,或者一个条件表达式。Issue issue = new Issue(); issue.IssueID = 2; issue = dc.GetData<Issue>(issue); Issue issue = dc.GetData<Issue>(2); Issue issue = dc.GetData<Issue>(Issue._.IssueID == 2);
- 更新一个
DataTable
int result = dc.UpdateDataTable<Issue>(dataTable);
高级功能
- 基本 SQL 函数,包括
GetCount
,GetMin
,GetMax
,GetSum
和GetAvg
int result = dc.GetCount<Issue>(); object minValue = dc.GetMin<Issue>(Issue._.Progress); decimal maxValue = Convert.ToDecimal(dc.GetMax<Issue>(Issue._.Progress, Issue._.Title == "test title"));
- 保存和存在
int result = dc.Save<Issue>(issue); bool saved = dc.Exists<Issue>(issue); bool ex = dc.Exists<Issue>(Issue._.Title == "test title");
- 部分列
Issue issue = dc.GetData<issue>(2, Issue._.Status); issue.Status = IssueStatus.Fixed; int result = dc.Update<Issue>(issue, Issue._.Status);
- 批量操作
int result = dc.Delete<issue>(Issue._.Status == IssueStatus.Fixed); result = dc.Update<Issue>(issue, Issue._.Status == IssueStatus.Fixed, Issue._.Status);
- 排序,"
OrderBy
" 方法和运算符^
和^ !
可以对查询结果进行排序。IEnumerable<Issue> query = dc.Query<Issue>(Issue.All.OrderBy(Issue._.IssueID)); query = dc.Query<Issue>(Issue._.Status == IssueStatus.Fixed ^ Issue._.IssueID);
- 分页
IList<Issue> issueList = dc.QueryForList<Issue>(Issue.All, 0, 100);
- 事务处理
try { this.dc.BeginTransaction(); try { int result = this.dc.Insert<Issue>(issue); this.dc.CommitTransaction(); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); this.dc.RollbackTransaction(); throw; } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); throw; }
- 多个键
MutipleKeysTable mt = dc.GetData<MutipleKeysTable>(new object[] { key1, key2 }, MutipleKeysTable.Except(MutipleKeysTable._.Value2));
- 使用常用命令进行查询
CommonCommand cmd = new CommonCommand(); cmd.CommandText = string.Format("SELECT [IssueID], [{0}] _ FROM .[Issue] WHERE [{0}] = @p1", Issue._.Title); cmd.Parameters.Add("@p1", "test title"); Issue issue = dc.GetData<Issue>(cmd);
- 执行常用命令,这些方法是
ExecuteForDataTable
、ExecuteForList
、ExecuteQuery
、ExecuteReader
、ExecuteScalar
和ExecuteNoQuery
。RaisingStudio.Data.CommonCommand cmd = new CommonCommand( string.Format("UPDATE .[{0}] SET [{1}] = [{1}] + _ 1 WHERE [{2}] = @p1", Issue._, Issue._.Progress, Issue._.IssueID)); cmd.AddParameter("@p1", System.Data.DbType.Int32, maxID); int result = this.dc.ExecuteNoQuery<Issue>(cmd);
- SQL 日志
DataContext dc = new DataContext(); dc.Log = System.Console.Out;
- 多个数据库提供程序,将以下 XML 元素添加到 "providers.config" 文件中,然后在 "connections.config" 中使用它。
<provider name="MYSQL" description="MySQL, MySQL provider " enabled="false" assemblyName="MySql.Data, Version=5.2.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionClass="MySql.Data.MySqlClient.MySqlConnection" commandClass="MySql.Data.MySqlClient.MySqlCommand" parameterClass="MySql.Data.MySqlClient.MySqlParameter" parameterDbTypeClass="MySql.Data.MySqlClient.MySqlDbType" parameterDbTypeProperty="MySqlDbType" dataAdapterClass="MySql.Data.MySqlClient.MySqlDataAdapter" commandBuilderClass="MySql.Data.MySqlClient.MySqlCommandBuilder" usePositionalParameters="false" useParameterPrefixInSql="true" useParameterPrefixInParameter="true" parameterPrefix="?" allowMARS="false" />
- 自定义数据类型转换器,以下代码是一个示例 "
TypeConverter
" 代码,并将其配置到 "converters.config" 文件中。public class PointConverter : IDbTypeConverter { #region IDbTypeConvertermember public object ConvertFromDbType(object value) { string s = value as string; if (!string.IsNullOrEmpty(s)) { string[] sa = s.Split(','); if ((sa != null) && (sa.Length == 3)) { int x = int.Parse(sa[0]); int y = int.Parse(sa[1]); int z = int.Parse(sa[2]); return new Point(x, y, z); } } return null; } public object ConvertToDbType(object value) { if (value is Point) { Point point = (Point)value; return point.ToString(); } return null; } #endregion }
<converter type="RaisingStudio.Data.Entities.Point, RaisingStudio.Data.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" dbType="string" converterType="RaisingStudio.Data.Entities.PointConverter, RaisingStudio.Data.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> </converter>
- 定义 config 文件,实体的 ".definition.xml" 文件可以嵌入到程序集中作为资源,或者将其保留在文件系统中。 由 "
EntitiesGenerator
" 工具生成的实体项目默认为嵌入式,如果我们想将其放在文件系统中的某个文件夹下,我们需要一个 "definitions.config" 文件。<?xml version="1.0" encoding="utf-8"?> <definitionsConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <aliases> <alias name="UTIssue" type="UnitTest.UTIssue, UnitTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </aliases> <definitions> <definition name="UTIssue" resource="definitions/Issue.definition.xml" /> <definition name="UTSystemUser" resource="definitions/SystemUser.definition.xml" /> </definitions> </definitionsConfig>
- 通用命令管理器。 将 SQL 命令配置到 "commands.config" 文件中,然后按如下方式使用它
<?xml version="1.0" encoding="utf-8" ?> <commands parameterPrefix=":"> <command name="select">SELECT * FROM DAC_ISSUE</command> <command name="select2"> <![CDATA[ SELECT * FROM DAC_USER ]]> </command> <command name="select3" commandType="StoredProcedure">SELECT_DAC_ISSUE</command> <command name="select4"> <![CDATA[ SELECT * FROM DAC_ISSUE DI WHERE DI.ISSUE_ID = :ISSUE_ID ]]> </command> </commands> CommonCommand cmd = CommandManager.Instance.GetCommand("select"); System.Data.DataTable dt = this.dc.ExecuteForDataTable(cmd);
团队博客
历史
- 2009 年 4 月 30 日:初始发布