開源數據訪問組件 DAC

fmms 12年前發布 | 22K 次閱讀 C# .NET開發

項目描述:


數據訪問組件,提供了一組類庫和一個代碼生成工具,使.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=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. 查詢實體, 通過三個不同的方法,可以分別獲得 IEnumerable<T>, IList<T> or 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 and 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. Save 和 Exists.
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. 使用 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<Issue>(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<Issue>(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 }
    <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. “實體定義”配置, ".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. Common command 管理器. 把 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> </pre> 
  </div> 
  
CommonCommand cmd = CommandManager.Instance.GetCommand("select");
System.Data.DataTable dt = this.dc.ExecuteForDataTable(cmd);

項目主頁:http://www.baiduhome.net/lib/view/home/1326091726734</p> </strong>

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!