在初次接觸sql時,筆者使用的是通過字符串拼接的方法來進行sql查詢,但這種方法有很多弊端
其中最為明顯的便是導致了sql注入。
通過特殊字符的書寫,可以使得原本正常的語句在sql數據庫里可編譯,而輸入者可以達到某些非法企圖甚至能夠破壞數據庫。
而參數化查詢有效解決了這個問題,參數化查詢是通過將傳入的sql語句其他部分進行編譯后再將其需要查詢的數據插入其中然后查詢,防止了在被查詢信息中出現語句的情況。
具體代碼例子如下:
/// <summary> /// 通用sql獲得語句,在第一個參數傳入sql語句,接下來以此寫入在sql中參數化的位置與需要用於替代的字符 /// </summary> /// <param name="sqlstring"></param> /// <param name="items"></param>以數組方式傳入可同時對sql語句多個位置進行賦值 /// <returns></returns> public DataTable Sql_Get_Datatable(string sqlstring, params string[] items) { string database = database_global; string str = @"server=DESKTOP-8ROVJ5G;Integrated Security=SSPI;database=" + database; //Integrated Security 綜合安全,集成安全 try { string ConnectionString = @"server=DESKTOP-8ROVJ5G;Integrated Security=SSPI;database=" + database; SqlConnection conn = new SqlConnection(ConnectionString); conn.Open(); SqlCommand cmd = new SqlCommand(); //生成新的連接 cmd.Connection = conn; int i; for (i = 0; i < items.Length; i += 2) //循環替換字符串中相應位置的參數,一個@something 對應一個 somenting { cmd.Parameters.Add("@"+items[i], SqlDbType.VarChar); cmd.Parameters["@" + items[i]].Value = items[i+1]; } SqlDataAdapter da = new SqlDataAdapter(cmd); //注意,此處參數應為設置完成的cmd DataTable dt = new DataTable(); da.Fill(dt); conn.Close(); conn.Dispose(); return dt; } catch { return null; } }
這是筆者自己寫的一個簡單的通過傳入sql語句與相關參數獲取相應DataTable數據的方法, 通過這種方法比為每一個需求寫一個方法來得封裝性更好一些。