当前位置: 移动技术网 > IT编程>开发语言>c# > 详解C#中SqlParameter的作用与用法

详解C#中SqlParameter的作用与用法

2019年07月18日  | 移动技术网IT编程  | 我要评论

一般来说,在更新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();
    }  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网