国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

SubSonic 的字段名未轉義問題修正

2019-11-18 16:43:09
字體:
來源:轉載
供稿:網友

SubSonic 是集代碼生成 / Build PRovider (asp.net 2.0 的新特性) 于一身的一個非常不錯的數據訪問框架。其靈感來自 ROR 里的 ActionPack. 非常適合于小型網站的快速開發。
昨天我開始使用這個框架,發現了一個小問題。

我有一個字段名為 Key,在生成一個 Select 語句的查詢時 sql 報錯。因為 Key 是一個關鍵字,而 SubSonic 產生的 SQL 中對此未作轉義處理。

Debug 時可以獲取其產生的 SQL 如下:

SELECT TOP 100 PERCENT  [cfg_Tips].[Id], [cfg_Tips].[Key], [cfg_Tips].[Descr], [cfg_Tips].[Value], [cfg_Tips].[Labels] FROM [cfg_Tips] WHERE [cfg_Tips].Key  =  @Key ORDER BY [Id];
我修改了一下源代碼中的 SqlDataProvider.cs 里的 BuildWhere 方法,暫時解決這個問題。

        protected static string BuildWhere(Query qry)
        {
            string where = "";
            string whereOperator = " WHERE ";

            foreach (Where wWhere in qry.wheres)
            {
                if (wWhere.ParameterValue != DBNull.Value)
                {
                    where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " +
                             Where.GetComparisonOperator(wWhere.Comparison) + " @" + wWhere.ParameterName;
                }
                else
                {
                    where += whereOperator + "[" + wWhere.TableName + "].[" + wWhere.ColumnName + "] " + Comparison.Is +
                             " NULL";
                }
                whereOperator = " AND ";
            }

            foreach (BetweenAnd between in qry.betweens)
            {
                where += whereOperator + "[" + between.TableName + "].[" + between.ColumnName + "] BETWEEN @start" +
                         between.ColumnName + " AND @end" + between.ColumnName;
                whereOperator = " AND ";
            }

            for (int i = qry.wheres.Count - 1; i >= 0; i--)
            {
                if (qry.wheres[i].ParameterValue == DBNull.Value)
                {
                    qry.wheres.RemoveAt(i);
                }
            }
            return where;
        }
我增加的部分在上面代碼中標注為綠色。
很奇怪,作者對表名加了方括弧,卻沒有加給列名,這樣顯然就不嚴謹了。

這個庫中還有 MySQLDataProvider 等類也有此問題。因為我現在暫時不用 MySQL, 就先不去改那些了。

另外有一個體會就是使用開源的第三方類庫時,盡量都用源代碼方式加入到項目中來。否則出錯了調試不進去。
現在,我使用這個框架的方法是利用它的生成類的那個網頁 GenerateAllClasses.aspx 做代碼生成,然后自己引用進來。雖然比默認的直接生成后在內存中編譯運行要麻煩一點,但是這樣便于 Debug. 還是很值得的。

posted on 2007-01-22 00:28 木野狐 閱讀(62) 評論(4)  編輯 收藏 引用 網摘 所屬分類: .NET

 
評論
# re: SubSonic 的字段名未轉義問題修正 2007-01-22 00:47 TerryLee
SubSonic還不錯,號稱是零代碼數據訪問層:)  回復  更多評論   

# re: SubSonic 的字段名未轉義問題修正 2007-01-22 00:49 木野狐
@TerryLee
呵呵,是的。不過我不敢用它的自動方式,畢竟感覺自己的控制少。理由就像這篇 post 所描述的一樣。
  回復  更多評論   

# re: SubSonic 的字段名未轉義問題修正 2007-01-22 00:53 TerryLee
@木野狐
嗯,沒錯

我只用它寫過一個小Demo:)  回復  更多評論   

# re: SubSonic 的字段名未轉義問題修正 2007-01-22 01:02 木野狐
另外使用時感覺這個東西的文檔還是少。舉的例子也很簡單。稍微有用一點的用法都靠我自己的摸索。
比如這個:
要根據條件加載一個對象,文檔(pdf)中提到可以用

對象.Load(...) 來加載,其中的參數可以是 IDataReader, DataRow, DataTable.

我用一個 IDataReader 傳進去,結果搞了半天都是出錯。最后調試到框架源代碼里發現必須在傳遞 IDataReader 進去之前,自己 Read 一次才能成功。比如我寫的這段簡單例子里用到:

/// <summary>
/// 得到經辦人所在科室的負責人
/// </summary>
/// <param name="staff"></param>
/// <returns></returns>
public static Staff GetManager(Staff staff) {
SubSonic.Query qry = new SubSonic.Query(Staff.Schema.Name);
qry.AddWhere(Staff.Columns.IsFunctionary, true);
qry.AddWhere(Staff.Columns.OfficeId, staff.OfficeId);

Staff manager = new Staff();
IDataReader reader = qry.ExecuteReader();
if (reader.Read())
{
manager.Load(reader);
}
return manager;
}

http://www.survivalescaperooms.com/RChen/archive/2007/01/22/actionpack1.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成安县| 通榆县| 大埔县| 高陵县| 梓潼县| 财经| 治多县| 遵义市| 忻州市| 保定市| 济宁市| 吉林省| 周宁县| 巴楚县| 磐石市| 晋江市| 昌江| 图木舒克市| 疏勒县| 广元市| 嘉荫县| 金秀| 青浦区| 聂荣县| 栖霞市| 察雅县| 财经| 德清县| 施甸县| 富锦市| 嵊州市| 沛县| 南漳县| 南川市| 叙永县| 新田县| 西城区| 钟祥市| 咸宁市| 德阳市| 侯马市|