详解C#中SqlParameter的作用与用法
一般来说,在更新DataTable或是DataSet时,如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接Sql语句来进行注入攻击。
stringsql ="update Table1setname='Pudding'whereID='1'";//未采用SqlParameter SqlConnection conn=newSqlConnection(); conn.ConnectionString ="Data Source=.\\SQLExpress;IntegratedSecurity=true;AttachDbFilename=|DataDirectory|\\Database.mdf;UserInstance=true";//连接字符串与数据库有关 SqlCommand cmd=newSqlCommand(sql, conn); try { conn.Open(); return(cmd.ExecuteNonQuery()); } catch(Exception) { return-1; throw; } finally { conn.Close(); }
上述代码未采用SqlParameter,除了存在安全性问题,该方法还无法解决二进制流的更新,如图片文件。通过使用SqlParameter可以解决上述问题,常见的使用方法有两种,Add方法和AddRange方法。
一、Add方法
SqlParameter sp=newSqlParameter("@name","Pudding"); cmd.Parameters.Add(sp); sp =newSqlParameter("@ID","1"); cmd.Parameters.Add(sp);
该方法每次只能添加一个SqlParameter。上述代码的功能是将ID值等于1的字段name更新为Pudding(人名)。
二、AddRange方法
SqlParameter[] paras=newSqlParameter[] {newSqlParameter("@name","Pudding"),newSqlParameter("@ID","1") }; cmd.Parameters.AddRange(paras);
显然,Add方法在添加多个SqlParameter时不方便,此时,可以采用AddRange方法。
下面是通过SqlParameter向数据库存储及读取图片的代码。
publicintSavePhoto(stringphotourl) { FileStream fs=newFileStream(photourl, FileMode.Open,FileAccess.Read);//创建FileStream对象,用于向BinaryReader写入字节数据流 BinaryReader br=newBinaryReader(fs);//创建BinaryReader对象,用于写入下面的byte数组 byte[] photo=br.ReadBytes((int)fs.Length);//新建byte数组,写入br中的数据 br.Close();//记得要关闭br fs.Close();//还有fs stringsql ="update Table1setphoto=@photowhereID='0'"; SqlConnection conn=newSqlConnection(); conn.ConnectionString ="Data Source=.\\SQLExpress;IntegratedSecurity=true;AttachDbFilename=|DataDirectory|\\Database.mdf;UserInstance=true"; SqlCommand cmd=newSqlCommand(sql, conn); SqlParameter sp=newSqlParameter("@photo", photo); cmd.Parameters.Add(sp); try { conn.Open(); return(cmd.ExecuteNonQuery()); } catch(Exception) { return-1; throw; } finally { conn.Close(); } } publicvoidReadPhoto(stringurl) { stringsql ="select photofromTable1whereID='0'"; SqlConnection conn=newSqlConnection(); conn.ConnectionString ="Data Source=.\\SQLExpress;IntegratedSecurity=true;AttachDbFilename=|DataDirectory|\\Database.mdf;UserInstance=true"; SqlCommand cmd=newSqlCommand(sql, conn); try { conn.Open(); SqlDataReader reader=cmd.ExecuteReader();//采用SqlDataReader的方法来读取数据 if(reader.Read()) { byte[] photo=reader[0]asbyte[];//将第0列的数据写入byte数组 FileStream fs=newFileStream(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(); }}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。