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

首頁 > 學院 > 開發(fā)設計 > 正文

通過一個正則表達式,讓SQLServer數(shù)據(jù)庫的帶參sql也支持位置參數(shù)語法!

2019-11-14 13:50:37
字體:
供稿:網(wǎng)友

.NET Framework 2.0 中,Microsoft 在 System.Data.Common 名稱空間下定義了一組類用來讓程序員編寫適用于不同數(shù)據(jù)庫的數(shù)據(jù)訪問代碼,而且還在 EnterPRise Library 中提供了一個標準的示范。但是這里面有很大的一個問題就是當程序員使用帶參sql的方式來訪問數(shù)據(jù)庫時,一切都變得毫無意義了。因為 SQL Server 支持以 @ 為前綴的名稱參數(shù)、Oracle 則支持以 : 為前綴的名稱參數(shù),而當使用 OleDb 訪問 access 時就變成了使用 ? 作為占位符的位置參數(shù)語法。在編寫程序時,必須針對不同的 ADO.NET Provider 編寫 sql 語句。

 


本文將介紹一種方法,可以使得 SQL Server、Oracle 也支持以 ? 為占位符的位置參數(shù)語法。要想實現(xiàn)這個效果,就需要將 sql 語句中的 ? 占位符替換成相應的名稱參數(shù)。下面以 SQL Server 數(shù)據(jù)庫為例,假如有一條 sql 語句:

select count(0) from sys_user where user_code=? and passWord=?

如果能夠?qū)⑵滢D(zhuǎn)變?yōu)椋?/p>

select count(0) from sys_user where user_code=@p1 and password=@p2

就可以使 SQL Server 也支持以 ? 為占位符的位置參數(shù)了。

 

 

在做這個變換時,我使用了一個正則表達式。通過這個正則表達式,可以將 sql 語句中的所有 ? 占位符找到,并將其替換為以 @ 為前綴的位置參數(shù),代碼如下:

private string PreparePlaceHolder(string srcSql){    string _sqlTokenPattern = "[//s]+|(?<string>'([^']|'')*')|(?<comment>(///*([^//*]|//*[^/])*//*/)|(--.*))|(?<parametermarker>//?)|(?<query>select)|(?<identifier>([//p{Lo}//p{Lu}//p{Ll}//p{Lm}//p{Nd}//uff3f_#$]+)|(/"([^/"]|/"/")*/"))|(?<other>.)";    Regex sqlTokenParser = new Regex(_sqlTokenPattern, RegexOptions.ExplicitCapture);    List<Group> groups = new List<Group>();    bool flag = false;    for (Match match = sqlTokenParser.Match(srcSql); Match.Empty != match; match = match.NextMatch())    {        if (!match.Groups["comment"].Success)        {            if ((match.Groups["comment"].Success || match.Groups["string"].Success) || match.Groups["other"].Success)            {                flag = true;            }            else if (match.Groups["query"].Success)            {                if (!flag)                {                    // 走到這里,表示這是一條 select 語句。                }            }            else if (match.Groups["parametermarker"].Success)            {                // 走到這里,表示發(fā)現(xiàn)了一個 ? 占位符。                groups.Add(match.Groups["parametermarker"]);            }        }    }    StringBuilder desSql = new StringBuilder(srcSql);    for (int i = groups.Count - 1; i >= 0; i--)    {        Group group = groups[i];        desSql.Remove(group.Index, group.Length);        desSql.Insert(group.Index, ParameterToken + "p" + (i + 1));    }    return desSql.ToString();}

利用上述方法,可以編寫出更加通用的 SQLHelper 類。程序員可以在任何時候使用位置參數(shù)語法來執(zhí)行 sql 語句,而不必考慮對應的 ADO.NET Provider 是否支持位置參數(shù)。

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巴林右旗| 博客| 峨眉山市| 固镇县| 浦江县| 会同县| 毕节市| 安顺市| 沂南县| 永丰县| 塔城市| 潞西市| 丁青县| 大同市| 揭阳市| 乌鲁木齐县| 宜章县| 昌宁县| 饶河县| 庄河市| 大同县| 建瓯市| 闽清县| 宁武县| 灵寿县| 铁岭市| 峨眉山市| 白沙| 古浪县| 扎赉特旗| 彭水| 西和县| 临猗县| 措美县| 邵东县| 金寨县| 蕉岭县| 玛纳斯县| 大丰市| 乌鲁木齐县| 衡东县|