65.9K
CodeProject 正在变化。 阅读更多。
Home

数据访问组件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (3投票s)

2009年5月1日

LGPL3

2分钟阅读

viewsIcon

150433

downloadIcon

2310

一个开源的数据访问组件。

引言

顾名思义,它是一个数据访问组件。 它提供了一个类库和一个工具。 在 .NET 项目中使用它可以使数据访问更容易。

中文介绍

它涵盖  

  • 支持多种类型的数据库
  • 以 DataSet、DataTable 和数据对象的形式提供数据
  • 执行 SQL 脚本和存储过程
  • 条件表达式
  • SQL 的基本功能,例如 MAXMIN 在查询中得到支持
  • 数据对象代码和 XML 文件生成器

使用代码 

基本函数

  1. 使用 "EntitiesGenerator" 工具生成一个实体项目。
    参考博客 如何使用 "Entities Generator" 工具创建实体项目
  2. 将名为 "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>
  3. 如果我们有一个名为 "Issue" 的实体对象类,可以使用以下代码将其插入到数据库中。
    RaisingStudio.Data.Providers.DataContext 
    dc = new RaisingStudio.Data.Providers.DataContext();
    dc.Insert<Issue>(issue);
  4. 更新一个对象。
    dc.Update<Issue>(issue);
  5. 要删除一个对象,我们可以将实体对象作为参数给出,或者只给出其键值。
    dc.Delete<Issue>(issue);

    dc.Delete<Issue>(issueID);
  6. 要查询对象,我们可以通过 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);
  7. 查询一个对象,我们可以使用 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);
  8. 更新一个 DataTable
    int result = dc.UpdateDataTable<Issue>(dataTable);

高级功能

  1. 基本 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"));
  2. 保存和存在
    int result = dc.Save<Issue>(issue);
    bool saved = dc.Exists<Issue>(issue);
    bool ex = dc.Exists<Issue>(Issue._.Title == "test title");
  3. 部分列
    Issue issue = dc.GetData<issue>(2, Issue._.Status);
    issue.Status = IssueStatus.Fixed;
    int result  = dc.Update<Issue>(issue, Issue._.Status);
  4. 批量操作
    int result = dc.Delete<issue>(Issue._.Status == IssueStatus.Fixed);
    result  = dc.Update<Issue>(issue, Issue._.Status == 
    			IssueStatus.Fixed, Issue._.Status);
  5. 排序,"OrderBy" 方法和运算符 ^^ ! 可以对查询结果进行排序。
    IEnumerable<Issue> query = dc.Query<Issue>(Issue.All.OrderBy(Issue._.IssueID));
    query = dc.Query<Issue>(Issue._.Status == IssueStatus.Fixed ^ Issue._.IssueID);
  6. 分页
     IList<Issue> issueList = dc.QueryForList<Issue>(Issue.All, 0, 100);
  7. 事务处理 
    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;
    } 
  8. 多个键
    MutipleKeysTable mt = dc.GetData<MutipleKeysTable>(new object[] { key1, key2 }, 
                 MutipleKeysTable.Except(MutipleKeysTable._.Value2));
  9. 使用常用命令进行查询
    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);
  10. 执行常用命令,这些方法是 ExecuteForDataTableExecuteForListExecuteQueryExecuteReaderExecuteScalar 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);
  11. SQL 日志
    DataContext dc = new DataContext();
    dc.Log = System.Console.Out;
  12. 多个数据库提供程序,将以下 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"    
        />
  13. 自定义数据类型转换器,以下代码是一个示例 "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>
  14. 定义 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>
  15. 通用命令管理器。 将 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 日:初始发布
© . All rights reserved.