本篇文章主要介绍了C#中SqlParameter的作用与用法,因为通过结构化查询语言语句的方式,有时候存在脚本注入的危险,所以在大多数情况下不建议用拼接结构化查询语言语句字符串方式,希望通过SqlParameter实现来实现对数据的操作。
一般来说,在更新数据表或是资料组时,如果不采用SqlParameter,那么当输入的结构化查询语言语句出现歧义时,如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接结构化查询语言语句来进行注入攻击。
字符串结构化查询语言
='更新
表1 set name="Pudding ",其中ID=" 1//未采用SqlParameter
SqlConnection
conn=new SqlConnection();
连接字符串
='数据
来源=。\ \ SQLExpress集成安全性=trueAttachDbFilename=|数据目录| \ \数据库。中纤板;user Instance=true ';//连接字符串与数据库有关
SqlCommand
cmd=new SqlCommand(sql,
conn);
尝试
{
conn . Open();
返回(cmd .ExecuteNonQuery());
}
捕捉(异常)
{
return-1;
扔;
}
最后
{
conn . Close();
}
上述代码未采用SqlParameter,除了存在安全性问题,该方法还无法解决二进制流的更新,如图片文件。通过使用SqlParameter可以解决上述问题,常见的使用方法有两种,添加方法和AddRange方法。
一、Add方法
SqlParameter
sp=new SqlParameter('@name ',' Pudding ');
cmd .参数。添加(sp);
sp
=new SqlParameter('@ID ',' 1 ');
cmd .参数。添加(sp);
该方法每次只能添加一个SqlParameter。上述代码的功能是将身份证明值等于一的字段名字更新为布丁(人名)。
二、AddRange方法
SqlParameter[]
paras=新的SqlParameter[]
{新SqlParameter('@name ',' Pudding '),新SqlParameter('@ID ',' 1 ')
};
cmd .参数。添加范围(段落);
显然,添加方法在添加多个SqlParameter时不方便,此时,可以采用AddRange方法。
下面是通过SqlParameter向数据库存储及读取图片的代码。
public int保存照片(string photourl)
{
文件流
fs=新文件流(photourl,
文件模式.打开,文件访问。阅读);//创建文件流对象,用于向二进制阅读器写入字节数据流
二进制阅读器
br=新的二进制阅读器(fs);//创建二进制阅读器对象,用于写入下面的字节数组
字节[]
照片=br .ReadBytes((int)fs .长度);//新建字节数组,写入英国铁路公司中的数据
br .close();//记得要关闭英国铁路公司
fs .close();//还有满量程
字符串结构化查询语言
='更新
表1设置photo=@photo其中ID=" 0
SqlConnection
conn=new SqlConnection();
连接字符串
='数据
来源=。\ \ SQLExpress集成安全性=trueAttachDbFilename=|数据目录| \ \数据库。中纤板;user Instance=true ';
SqlCommand
cmd=new SqlCommand(sql,
conn);
SqlParameter
sp=新的SqlParameter('@photo ',
照片);
cmd .参数。添加(sp);
尝试
{
conn . Open();
返回(cmd .ExecuteNonQuery());
}
捕捉(异常)
{
return-1;
扔;
}
最后
{
conn . Close();
}
}
公共作废ReadPhoto(字符串网址)
{
字符串结构化查询语言
='选择
ID="0 "的表一中的照片;
SqlConnection
conn=new SqlConnection();
连接字符串
='数据
来源=。\ \ SQLExpress集成安全性=trueAttachDbFilename=|数据目录| \ \数据库。中纤板;user Instance=true ';
SqlCommand
cmd=new SqlCommand(sql,
conn);
尝试
{
conn . Open();
SqlDataReader
reader=cmd .ExecuteReader();//采用SqlDataReader的方法来读取数据
如果(读者. Read())
{
字节[]
photo=reader[0]as byte[];//将第0列的数据写入字节数组
文件流
fs=新文件流(url,文件模式.新建);创建文件流对象,用于写入字节数据流
fs .写(照片,0,照片。长度);//将字节数组中的数据写入满量程
fs .close();//关闭满量程
}
读者. close();//关闭读者
}
接住(异常
ex)
{
扔;
}
最后
{
conn . Close();
} }}
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。