zoukankan      html  css  js  c++  java
  • SqlParameter的作用与用法

    因为通过SQL语句的方式,有时候存在脚本注入的危险,所以在大多数情况下不建议用拼接SQL语句字符串方式,希望通过SqlParameter实现来实现对数据的操作,针对SqlParameter的方式我们同样可以将其封装成一个可以复用的数据访问类,只是比SQL语句的方式多了一个SqlParameter的参数。

    AD:
    2013大数据全球技术峰会低价抢票中

    一般来说,在更新DataTable或是DataSet时,如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接Sql语句来进行注入攻击。

    1. string sql = "update Table1 set name = 'Pudding' where ID = '1'";//未采用SqlParameter   
    2. SqlConnection conn = new SqlConnection();   
    3. conn.ConnectionString = "Data Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true";//连接字符串与数据库有关   
    4. SqlCommand cmd = new SqlCommand(sql, conn);   
    5. try   
    6. {   
    7. conn.Open();   
    8. return(cmd.ExecuteNonQuery());   
    9. }   
    10. catch (Exception)   
    11. {   
    12. return -1;   
    13. throw;   
    14. }   
    15. finally   
    16. {   
    17. conn.Close();   
    18. }  

    上述代码未采用SqlParameter,除了存在安全性问题,该方法还无法解决二进制流的更新,如图片文件。通过使用SqlParameter可以解决上述问题,常见的使用方法有两种,Add方法和AddRange方法。

    一、Add方法

    1. SqlParameter sp = new SqlParameter("@name""Pudding");   
    2. cmd.Parameters.Add(sp);   
    3. sp = new SqlParameter("@ID""1");   
    4. cmd.Parameters.Add(sp);  

    该方法每次只能添加一个SqlParameter。上述代码的功能是将ID值等于1的字段name更新为Pudding(人名)。

    二、AddRange方法

    1. SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@name""Pudding"), new SqlParameter("@ID""1") };   
    2. cmd.Parameters.AddRange(paras);  

    显然,Add方法在添加多个SqlParameter时不方便,此时,可以采用AddRange方法。 

    下面是通过SqlParameter向数据库存储及读取图片的代码。

    1. view sourceprint?01 public int SavePhoto(string photourl)   
    2. {   
    3. FileStream fs = new FileStream(photourl, FileMode.Open, FileAccess.Read);//创建FileStream对象,用于向BinaryReader写入字节数据流   
    4. BinaryReader br = new BinaryReader(fs);//创建BinaryReader对象,用于写入下面的byte数组   
    5. byte[] photo = br.ReadBytes((int)fs.Length); //新建byte数组,写入br中的数据   
    6. br.Close();//记得要关闭br   
    7. fs.Close();//还有fs   
    8. string sql = "update Table1 set photo = @photo where ID = '0'";   
    9. SqlConnection conn = new SqlConnection();   
    10. conn.ConnectionString = "Data Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true";   
    11. SqlCommand cmd = new SqlCommand(sql, conn);   
    12. SqlParameter sp = new SqlParameter("@photo", photo);   
    13. cmd.Parameters.Add(sp);   
    14. try   
    15. {   
    16. conn.Open();   
    17. return (cmd.ExecuteNonQuery());   
    18. }   
    19. catch (Exception)   
    20. {   
    21. return -1;   
    22. throw;   
    23. }   
    24. finally   
    25. {   
    26. conn.Close();   
    27. }   
    28. }   
    29. public void ReadPhoto(string url)   
    30. {   
    31. string sql = "select photo from Table1 where ID = '0'";   
    32. SqlConnection conn = new SqlConnection();   
    33. conn.ConnectionString = "Data Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true";   
    34. SqlCommand cmd = new SqlCommand(sql, conn);   
    35. try   
    36. {   
    37. conn.Open();   
    38. SqlDataReader reader = cmd.ExecuteReader();//采用SqlDataReader的方法来读取数据   
    39. if (reader.Read())   
    40. {   
    41. byte[] photo = reader[0] as byte[];//将第0列的数据写入byte数组   
    42. FileStream fs = new FileStream(url,FileMode.CreateNew);创建FileStream对象,用于写入字节数据流   
    43. fs.Write(photo,0,photo.Length);//将byte数组中的数据写入fs   
    44. fs.Close();//关闭fs   
    45. }   
    46. reader.Close();//关闭reader   
    47. }   
    48. catch (Exception ex)   
    49. {   
    50. throw;   
    51. }   
    52. finally   
    53. {   
    54. conn.Close();   
    55. }   
    56. }   
    57. }  
  • 相关阅读:
    【模板】辗转相除法
    【模板】冰茶姬(大概是全的?)
    【模板】快速幂
    【模板】线段树-区间修改
    【模板】线段树-单点修改,区间查询
    【模板】dijkstra与floyd
    【模板】SPFA(不完全详解)
    【济南集训】随机分数
    P3205 [HNOI2010]合唱队
    最大子列2
  • 原文地址:https://www.cnblogs.com/rinack/p/3073426.html
Copyright © 2011-2022 走看看