切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
详解C#中SqlParameter的作用与用法
作者:ych
>因为通过SQL语句的方式,有时候存在脚本注入的危险,所以在大多数情况下不建议用拼接SQL语句字符串方式,希望通过SqlParameter实现来实现对数据的操作。 一般来说,在更新DataTable或是DataSet时,如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接Sql语句来进行注入攻击。 SqlParameter类型的数组作为SqlCommand的参数存在,配合转义字符@,可以有效的防止' or 1=1--单引号而截断字符串,这一经典的注入语句,有效提高拼接型sql命令的安全性。 ``` string sql = "update Table1 set name = 'Pudding' where ID = '1'";//未采用SqlParameter SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true";//连接字符串与数据库有关 SqlCommand cmd = new SqlCommand(sql, conn); try { conn.Open(); return(cmd.ExecuteNonQuery()); } catch (Exception) { return -1; throw; } finally { conn.Close(); } ``` 上述代码未采用SqlParameter,除了存在安全性问题,该方法还无法解决二进制流的更新,如图片文件。通过使用SqlParameter可以解决上述问题,常见的使用方法有两种,Add方法和AddRange方法。 一、Add方法 ``` SqlParameter sp = new SqlParameter("@name","Pudding"); cmd.Parameters.Add(sp); sp= new SqlParameter("@ID","1"); cmd.Parameters.Add(sp); ``` 该方法每次只能添加一个SqlParameter。上述代码的功能是将ID值等于1的字段name更新为Pudding(人名)。 二、AddRange方法 ``` SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@name","Pudding"),new SqlParameter("@ID","1") }; cmd.Parameters.AddRange(paras); ``` 显然,Add方法在添加多个SqlParameter时不方便,此时,可以采用AddRange方法。 下面是通过SqlParameter向数据库存储及读取图片的代码。 ``` public int SavePhoto(string photourl) { FileStream fs = new FileStream(photourl, FileMode.Open, FileAccess.Read);//创建FileStream对象,用于向BinaryReader写入字节数据流 BinaryReader br = new BinaryReader(fs);//创建BinaryReader对象,用于写入下面的byte数组 byte[] photo = br.ReadBytes((int)fs.Length);//新建byte数组,写入br中的数据 br.Close();//记得要关闭br fs.Close();//还有fs string sql = "update Table1 set photo = @photo where ID = '0'"; SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true"; SqlCommand cmd = new SqlCommand(sql, conn); SqlParameter sp = new SqlParameter("@photo", photo); cmd.Parameters.Add(sp); try { conn.Open(); return (cmd.ExecuteNonQuery()); } catch (Exception) { return -1; throw; } finally { conn.Close(); } } public void ReadPhoto(string url) { string sql = "select photo from Table1 where ID = '0'"; SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true"; SqlCommand cmd = new SqlCommand(sql, conn); try { conn.Open(); SqlDataReader reader = cmd.ExecuteReader();//采用SqlDataReader的方法来读取数据 if (reader.Read()) { byte[] photo = reader[0] as byte[];//将第0列的数据写入byte数组 FileStream fs = new FileStream(url,FileMode.CreateNew);创建FileStream对象,用于写入字节数据流 fs.Write(photo,0,photo.Length);//将byte数组中的数据写入fs fs.Close();//关闭fs } reader.Close();//关闭reader } catch (Exception ex) { throw; } finally { conn.Close(); } }} ```
相关推荐
.Net面试题
.net 10万+大数据处理方式、应用场景
单例模式的应用场景
什么是死锁?死锁产生的原因?如何避免死锁?
B+树为什么快
MySQL索引原理
C#二叉树查找法
Redis的优点
ElasticSearch使用场景
redis缓存穿透、缓存击穿、缓存雪崩原因+解决方案
消息队列使用的场景介绍
redis在项目中的使用
TiDB使用场景
.net插入日志数据纠错
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1