在初次接触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数据的方法, 通过这种方法比为每一个需求写一个方法来得封装性更好一些。