標籤:
前兩天上課的內容總結了下,一般在串連層基本就調用那幾個類。
一般包括System.Data.SqlClient和System.Data下的SqlConnection,SqlCommand,SqlDataReader這三個類。如果,要想從設定檔中讀取的話,還需要System.Configuration。
到底怎麼串連我想書上都有,就不寫了。寫單私貨,和老師在上課時講的不一樣的。
方法大家一開始是這麼寫的
static string connStr = @"Data Source=.\Test;Initial Catalog=test;Integrated Security=True"; public static SqlDataReader GetReader(string sql,params SqlParameter[] pars) { using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand comm = new SqlCommand(sql, conn)) { comm.Parameters.AddRange(pars); conn.Open(); return comm.ExecuteReader(CommandBehavior.CloseConnection); } } }
先擷取連接字串(這裡用變數意思一下),然後傳SqlParameters數組和sql語句。大多數人也都這麼寫。但定義參數數組太麻煩了,有好多字,也挺麻煩的。
後來想了想,有沒有更好的辦法呢。要是能讓他自己摘開sql變數多好。於是就寫了下面方法
//拆解sql得到變數數組,返回list<string>類型的Sql變數數組 private static List<string> GetParamaters(string sql) { string meat = sql; char[] cArray = " ,=()><".ToCharArray(); for (int i = 0; i < cArray.Length; i++) { meat = meat.Replace(cArray[i], ‘☆‘); } List<string> list = meat.Split(‘☆‘).Where(s => s.Contains("@")).ToList(); list = RemoveRepeatPars(list); return list; }
原理其實就是,sql變數前後字元畢竟也就那麼幾個麼“ ,=()<>”,然後用一個稀有的字元替換下(比如上面那個小星星),以免破壞變數名。再用string.Split
把他們按照沒用的字元截斷扔進一個集合裡,這樣我們把變數前後都打斷,再拿出包含‘@‘字元的字串,這些就都是乾淨的變數名了。是吧。
不過之前還有一步,就是把重複的變數去掉!(有些時候用update的時候set一個變數where一個變數有可能會重複)
private static List<string> RemoveRepeatPars(List<string> list) { for (int i = 0; i < list.Count; i++) { string s = list[i]; while (true) { if (list.IndexOf(s) != list.LastIndexOf(s)) list.RemoveAt(list.LastIndexOf(s)); else break; } } return list; }
前後索引都不一樣的,八成就是重複的。排除之後就剩下純淨的sql參數了!
然後就這麼改下原來的方法
private static List<string> GetParamaters(string sql) { string meat = sql; char[] cArray = " ,=()><".ToCharArray(); for (int i = 0; i < cArray.Length; i++) { meat = meat.Replace(cArray[i], ‘☆‘); } List<string> list = meat.Split(‘☆‘).Where(s => s.Contains("@")).ToList(); list = RemoveRepeatPars(list); return list; }
把這兩個方法合并,sql的加工就寫好了。下面再改下之前的方法
public static SqlDataReader GetReader(string sql, params object[] pars) { List<string> list = GetParamaters(sql);//上來就先截成參數集合 if (list.Count != pars.Length) { throw new Exception("語句中參數個數與給定參數不相符!");//判斷一下sql中的參數是不是和給的參數一樣多,萬一寫錯了呢 } using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand comm = new SqlCommand(sql, conn)) { for (int i = 0; i < pars.Length; i++)//反正兩個數組數量一樣多,隨便選一個直接加就行了 { comm.Parameters.AddWithValue(list[i], pars[i]); conn.Open(); } return comm.ExecuteReader(); } } }
然後就用加params的object[]的數組代替原來的Sqlparameters參數了,這樣就方便多了,再也不用定義SqlParameters了
如果下次再要寫參數就直接這樣寫
GetReader(sql,1,"name",0.14,1m)
就好了。就像Console.WriteLine()一樣方便(自我感覺)。
學習寫個Sqlserver的協助類