一般来说,在更新DataTable或是DataSet时,如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接Sql语句来进行注入攻击。 string sql = "update Table1 set name = 'Pudding' where ID = '1'";//未采用SqlParameterSqlConnection 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(); } }}
详细解决方案
SqlParameter的功用与用法
热度:84 发布时间:2016-05-05 13:16:09.0
相关解决方案
- sqlparameter 要不要指定数据类型跟大小
- .NET代码 new SqlParameter("@tName" SqlDbType.VarChar, max)用什么取代max,该如何解决
- linq 施用 SqlParameter
- 另一个 SqlParameterCollection 中已包孕 SqlParameter
- SqlParameterCollection 只接受非空的 SqlParameter 部类对象。 参数名: value
- SqlParameter 对同一个字段大于某值,小于某值,如何写
- SqlParameter[] 填充有关问题
- 此 SqlParameterCollection 中未包含带有 ParameterName“RETURNVALUE”的 SqlParameter,该如何处理
- 另一个 SqlParameterCollection 中已包含 SqlParameter,该怎么处理
- SqlParameter 带参数执行SQL语句的有关问题
- 另一个 SqlParameterCollection 中已包含 SqlParameter。该怎么解决
- SqlParameter 用法
- SqlParameter 事宜 批量数据插入
- SqlParameter 根本用法
- SqlParameter、Combox、PictureBox、OpenFileDialog 应当注意的几点