当前位置: 首页 > news >正文

参数化SQL小认识

在做机房收费系统项目,编写数据连接并访问数据库时,见别人都用了带“@”字符的SQL语句,就很好奇为什么都用这个语句呢?直接拼写SQL语句不是更加方便吗?带着这个问题上网查资料,才知道原来他们用的是参数化SQL,那么为什么要用参数化SQL?什么是参数化SQL呢?

在做第一次机房收费系统的时候,大部分的应该都是使用直接拼SQL语句的方法,那时候就听前辈们有说到SQL注入,那时候也不要求了解,只需要知道就行。


1.直接拼SQL:

就像大家在做第一次机房收费系统的时候所了解到的一样,直接拼写SQL很容易带来SQL注入攻击,但是因为直接拼写不用添加SqlParameter,所以会减少很少的代码。因此,这种方法也会把你直接编写的命令直接发到数据服务器上直接执行。


2.参数化SQL:

所谓的“参数化SQL”就是在应用程序设置SqlCommand.CommandText的时候使用参数(如:param1),然后通过SqlCommand.Parameters.Add来设置这些参数的值。这种做法会把你准备好的命令通过sp_executesql系统存储过程来执行,使用参数化,最直接的好处就是防止SQL注入。也就是说使用这种方法,主要是为了保证数据库的安全


参数化SQL原理:

在使用参数化查询的情况下,数据服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令之后,才套用参数执行,因此就算参数中含有有损的指令,也不会被数据库执行。

下面只是自己在做机房收费系统项目的时候,用到参数化查询的一个小例子:

Public Class SqlStuBasicInfo : Implements IStuBasicInfo

    Dim strConnstr As String = System.Configuration.ConfigurationSettings.AppSettings("connstr")  '通过反射获取数据连接
    Dim conn As SqlConnection = New SqlConnection(strConnstr)    '实例化Connection对象
    ''' <summary>
    ''' 判断卡号是否存在
    ''' </summary>
    ''' <param name="Icard"></param>
    ''' <returns>返回实体层</returns>
    ''' <remarks></remarks>

    Public Function CheckcardNO(Icard As StuBasicInfo) As Enity.StuBasicInfo Implements IStuBasicInfo.CheckcardNO

        Dim sql As String = "select * from T_STUBASICINFO Where CardNo=@CardNo"
        Dim params As SqlParameter()

        params = {New SqlParameter("CardNo", Icard.CardNo)}

        Dim cmd As SqlCommand = New SqlCommand(sql, conn)
        cmd.Parameters.AddRange(params)

        Dim reader As SqlDataReader
        Try
            conn.Open()
            reader = cmd.ExecuteReader
            reader.Read()
            Icard.CardNo = Trim(reader.Item("CardNo"))
            Return Icard

        Catch ex As Exception

            Icard.CardNo = ""
            Return Icard

        End Try

    End Function

以前,对学习新的知识总是带有一种恐惧感,总觉得自己不能把它们弄明白。看到别人在做项目的时候,用到了很多自己不会的知识,就觉得很有压力,其实换一种心态去想,这正是给你提供了一个提升自我的机会,谁不是从不会走过来的!

相关文章:

  • Win32_5程序员求爱的创意程序^_^
  • cisco单臂路由
  • VC2010中 调用DLL的方法
  • Win32_6Win32的验证码程序
  • iOS Xcode, 解决“Could not insert new outlet connection”的问题。
  • Win32_7由浅入深——滚动条
  • 简单实现web服务器负载均衡
  • Android编程之ActivityManager: Segmentation fault
  • C# 网络编程之网页简单下载实现
  • mac 下对 iterm 终端 设置代理
  • 如何理解c和c++的复杂类型声明
  • silverlight中datagrid数据到处excel
  • Android编程之如何取得View的当前位置
  • Android4.0内存Dex数据动态加载技术
  • C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Javascript编码规范
  • Laravel 菜鸟晋级之路
  • Logstash 参考指南(目录)
  • nfs客户端进程变D,延伸linux的lock
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从输入URL到页面加载发生了什么
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 二维平面内的碰撞检测【一】
  • 高程读书笔记 第六章 面向对象程序设计
  • 给新手的新浪微博 SDK 集成教程【一】
  • 入口文件开始,分析Vue源码实现
  • 数组大概知多少
  • 思考 CSS 架构
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (转)使用VMware vSphere标准交换机设置网络连接
  • ..回顾17,展望18
  • .apk 成为历史!
  • .NET 事件模型教程(二)
  • .NET 指南:抽象化实现的基类
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .py文件应该怎样打开?
  • @Bean, @Component, @Configuration简析
  • @property python知乎_Python3基础之:property
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [HJ73 计算日期到天数转换]
  • [HTML]HTML5实现可编辑表格
  • [LuoguP1141]01迷宫
  • [MRCTF2020]Ez_bypass1
  • [NHibernate]条件查询Criteria Query