一般来说,在更新datatable或是dataset时,如果不采用sqlparameter,那么当输入的sql语句出现歧义时,如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接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(); } }}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
C#实现获取本地内网(局域网)和外网(公网)IP地址的方法分析
网友评论