开源数据访问组件DAC

C# 常用工具包

详细介绍

项目描述:

数据访问组件,提供了一组类库和一个代码生成工具,使.net项目中数据访问更简化.

功能:

  • 多种数据库支持.
  • 提供DataSet, DataTable 和数据实体查询.
  • 执行SQL脚本及存储过程.
  • 条件表达式.
  • 常用SQL方法, 如MAX, MIN等可能被应用在查询中.
  • 数据实体代码及XML文件生成.

使用:

基本功能:

1. 使用 “EntitiesGenerator” 生成工具生成实体项目。
参见 blog: How to use the “Enties Generator” tool to create an entities
project
.

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=Trueconnection>  
connections>

3. 假定我们有个实体类,名叫 “Issue”, 可以使用以下代码将它插入数据库

    RaisingStudio.Data.Providers.DataContext dc = new RaisingStudio.Data.Providers.DataContext();  
    dc.Insert(issue);

4. 更新实体.

    dc.Update(issue);

5. 删除实体, 可以通过给定实体或实体的主键值进行。

    dc.Delete(issue);

    dc.Delete(issueID);

6. 查询实体, 通过三个不同的方法,可以分别获得 IEnumerable, IList or DataTable 作为返回结果。

    IEnumerable query = dc.Query();  
    foreach(Issue issue in query)  
    {  
    }



    IList issueList = dc.QueryForList();

在查询中,还可以使用“条件表达式”.

    DataTable dataTable = dc.QueryForDataTable(Issue._.IssueID > 1);

7. 可以通过GetData()方法,查询单个实体,使用包含主键值的实体,主键值或条件表达式作为参数。

    Issue issue = new Issue();  
    issue.IssueID = 2;  
    issue = dc.GetData(issue);



    Issue issue = dc.GetData(2);



    Issue issue = dc.GetData(Issue._.IssueID == 2);

8. 更新DataTable.

    int result = dc.UpdateDataTable(dataTable);
高级特性:

1. 常用SQL方法, 包括 GetCount, GetMin, GetMax, GetSum and GetAvg.

int result = dc.GetCount();  
object minValue = dc.GetMin(Issue._.Progress);  
decimal maxValue = Convert.ToDecimal(dc.GetMax(Issue._.Progress,  
              Issue._.Title == "test title"));

2. Save 和 Exists.

int result = dc.Save(issue);  
bool saved = dc.Exists(issue);  
bool ex = dc.Exists(Issue._.Title == "test title");

3. 部分列.

Issue issue = dc.GetData(2, Issue._.Status);  
issue.Status = IssueStatus.Fixed;  
int result  = dc.Update(issue, Issue._.Status);

4. 批量操作.

int result = dc.Delete(Issue._.Status == IssueStatus.Fixed);  
result  = dc.Update(issue, Issue._.Status == IssueStatus.Fixed, Issue._.Status);

5. 排序, 使用 “OrderBy” 方法或 ^ 和 ^ ! 运算符应用在查询中,可以对查询进行排序.

IEnumerable query = dc.Query(Issue.All.OrderBy(Issue._.IssueID));  
query = dc.Query(Issue._.Status == IssueStatus.Fixed ^ Issue._.IssueID);

6. 分页.

 IList issueList = dc.QueryForList(Issue.All, 0, 100);

7. 事务.

try  
{  
    this.dc.BeginTransaction();  
    try  
    {  
        int result = this.dc.Insert(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(new object[] { key1, key2 },   
             MutipleKeysTable.Except(MutipleKeysTable._.Value2));

9. 使用 common command 查询.

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(cmd);

10. 执行 common command, 支持 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(cmd);

11. SQL 脚本日志.

DataContext dc = new DataContext();  
dc.Log = System.Console.Out;

12. 多种数据库 providers, 添加如下的 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  
}




dbType="string"   
converterType="RaisingStudio.Data.Entities.PointConverter,   
RaisingStudio.Data.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">  
converter>

14. “实体定义”配置, “*.definition.xml”
文件可以作为资源文件嵌入到程序集在,也可以留在文件系统上,”EntitiesGenerator” 实体生成工具生在项目是采用的嵌入资源的方式,
如果要使用文件的方式,则需要配置一个名叫”definitions.config”的配置文件,样式如下:

xml version="1.0" encoding="utf-8"?>  
<definitionsConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
  <aliases>

  aliases>  
  <definitions>  
    <definition name="UTIssue" resource="definitions/Issue.definition.xml" />  
    <definition name="UTSystemUser" resource="definitions/SystemUser.definition.xml" />  
  definitions>    
definitionsConfig>

15. Common command 管理器. 把 SQL脚本配置在 “commands.config” 中后,可以用如下代码读取使用。

xml version="1.0" encoding="utf-8" ?>  
<commands parameterPrefix=":">  
  <command name="select">SELECT * FROM DAC_ISSUEcommand>  
  <command name="select2">

    SELECT * FROM DAC_USER  
    ]]>  
  command>  
  <command name="select3" commandType="StoredProcedure">SELECT_DAC_ISSUEcommand>  
  <command name="select4">

    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);