一般来说,在更新DataTable或是DataSet时,如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,如字符串中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接Sql语句来进行注入攻击。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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方法

1
2
3
4
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方法

1
2
SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@name","Pudding"),new SqlParameter("@ID","1") };
cmd.Parameters.AddRange(paras);
  显然,Add方法在添加多个SqlParameter时不方便,此时,可以采用AddRange方法。
  下面是通过SqlParameter向数据库存储及读取图片的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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();
        }    }}

.NET 向SQL里写入非Text类型的更多相关文章

  1. SQL SERVER 如果判断text类型数据不为空

    一个字段Remark的数据类型设置先设置为varcharr(255),后来考虑到扩展性需要将其定义为TEXT类型,但是SQL 语句报错.      SQL 语句:      SELECT * FROM ...

  2. sql 里 text类型的操作(转载)

    SQL Server中TEXT类型字段值在数据库中追加字符串方法 对text类型字段值进行追加更新的操作,一开始用了简单的update语句试了试,有错误,原来text.ntext类型的字段不能和 va ...

  3. Sql Server Text 类型列 查询和更新

    Text(ntext.image)类型为大数据字段,因为存储方式不同,也决定了其查询和更新不同于一般方法. 1.表定义: 2.查询: Like查询是可用的: select * from dbo.nod ...

  4. 数据库表中存在Text类型的属性时,写sql语句时需要注意喽!

    之前,习惯性地写查询语句时,查询条件用“=”判断.今天写程序的时候,查询时突然报了一个错误:数据类型text 和varchar 在equal to 运算符中不兼容.查看了一下数据库发现,其中有一个属性 ...

  5. 未经处理的异常在 System.Data.dll 中发生。其它信息:在应使用条件的上下文(在 '***' 附近)中指定了非布尔类型的表达式。

    机房收费系统中,有些人在联合查询这个模块用的是存储过程.我先尝试着在数据库中建立了一个视图.然后在UI层做个推断并生成查询条件strCondition. 在机房收费系统的"联合查询" ...

  6. Mysql BLOB和TEXT类型

      BLOB是一个二进制大对象,可以容纳可变数量的数据.有4种BLOB类型:TINYBLOB.BLOB.MEDIUMBLOB和LONGBLOB.它们只是可容纳值的最大长度不同. A binary la ...

  7. ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置

    背景: 由于本人使用的是6.0以上的版本es,在使用发现很多中文博客对于mapping参数的说明已过时.ES6.0以后有很多参数变化. 现我根据官网总结mapping最新的参数,希望能对大家有用处. ...

  8. 【MySQL】使用Length和Cast函数计算TEXT类型字段的长度

    背景: 前段时间,业务需要,为了快速让解析的Excel入库,所以把不是很确定的字段全部设置成了TEXT. 今天需要进行表结构优化,把字段长度控制在合适的范围,并尽量不使用TEXT类型. -- 计算长度 ...

  9. 使用JPA储存Text类型的时候 出现乱码的问题

    以前遇到这类问题第一个反应就是觉得客户端和服务端的编码不一样导致的.所以一开始也是那么认为的.以为我们项目使用的是pgsql,默认的就是utf-8,然后我们使用了字符也是utf-8,并且还有一个问题就 ...

随机推荐

  1. STORM_0007_Multi-Lang protocol of Storm/多语言协议的翻译

    原始地址: http://storm.apache.org/releases/1.0.1/Multilang-protocol.html 这个协议试用0.7.1之后的版本   通过ShellBolt和 ...

  2. x名称空间中的标记拓展

    1.x:Type Type类可作为所有数据类型在编程层面上的抽象.在XAML中,如果想表达某个数据类型时就需要使用x:Type标记拓展.例子: 创建一个Button的派生类: using System ...

  3. C++学习网站

    1. CPLUSPLUS 2. CPROGRAMMING

  4. winform打开唯一窗体、构造函数传值

    制作登入窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...

  5. web设计经验<六>令网站看起来不专业的10个设计误区

    不管你是不是一个羽翼未丰企业的领导,专业的网站能为你带来的东西比你想象的多很多.退一万步来说,“考虑到我们是一个小厂”,粗糙的网站也许能被用户理解,但是不一定能接受.每天大家所浏览的大量的网站,已经从 ...

  6. GFS Google File System(中文翻译)

    Google文件系统 GFS是一个可扩展的分布式文件系统,用于大型的.分布式的.对大量数据进行访问的应用.它运行于廉价的普通硬件上,但可以提供容错功能.它可以给大量的用户提供总体性能较高的服务. 1. ...

  7. 【Todo】Python字符编码学习

    Python中经常出现字符编码问题,在这里统一整理吧. 参考这篇文章:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 另外这个人 ...

  8. Objective-C与C++的区别

    1.两者的最大相同:都是从C演化而来的面相对象语言,两者都兼容标准C语言 2.两者的最大不同:Objective-C提供了运行期动态绑定机制,而C++是编译静态绑定,并且通过嵌入类(多重继承)和虚函数 ...

  9. PHP中file_put_contents追加和换行

    在PHP的一些应用中需要写日志或者记录一些信息,这样的话.可以使用fopen(),fwrite()以及 fclose()这些进行操作.也可以简单的使用file_get_contents()和file_ ...

  10. JavaScript的事件对象_其他属性和方法

    在标准的 DOM 事件中,event 对象包含与创建它的特定事件有关的属性和方法.触发的事件类型不一样,可用的属性和方法也不一样. 在这里,我们只看所有浏览器都兼容的属性或方法.首先第一个我们了解一下 ...