之前项目有一放行的功能,对某界面维护时(数据的增删改),先将数据保存到临时表中,放行后再真正的写入到库中。由于设计到主从表多中约束关系,所以当时我采用的是写一个存储过程来对某个界面的操作进行统一处理,具体参见关于MVC项目中的主管放行。现在sa 说不得使用存储过程为由让更改(开发文档中写明: 尽量少用存储过程),自以为仅仅是将sql 挪一个位置,实际在修改中 在 in 这个地方还是费了不少时间。

在谈及 in 之前,先说下参数传递的三种方式

1. 字符串拼接 ' "+str+" ' ,很容易理解,好用,所谓的字符串拼接,对于非前台界面传入的参数可以直接这样写,可避免sql 注入,前台输入的参数若直接用此方法,则可被sql注入

2. Parameter ,也常见,常规的操作直接传入参数即可 如update:  set A.name = @name   此处name经过sql 编译后 自动会加入单引号 ' '

3. 占位符 {0},用String.Format 拼接,当某段sql中存在出现多次相同的参数时,用此方法比较方便,如果用2,则要写para1,para2 ,para3,若用3,只需要写一个 ‘{0}’

上面的搞清楚了,现在来看一看 in 这个比较特殊的问题,当传递的参数本身就包含逗号时,就比较搅了,如 'a1,b1','a2,b2','a3,b3'

诸如: 用到IN的存储过程,需要转两个弯弯,先用EXEC( '   ' ) 包裹一遍,然后里面所用到的值都要加一个单引号,如 '' D'' , 对于IN后带@的参数,为 '+@str+',普通的参数加两对单引号

'''+@appuserid+'''
            EXEC('
--刪除
DELETE FROM A
WHERE TableKey IN
(SELECT TableKey FROM tempA WHERE sFlag = ''D'' AND ApplyUserID = '''+@appuserid+''' AND TableKey IN('+@str+')) --清空臨時資源表
DELETE FROM tempZT_SysConfig_Master WHERE TableKey IN ('+@str+');
')

诸如:一般不需要用到存储过程、事务和IN关键字的SQl 而言,直接写入即可(成功)

SELECT * FROM A  WHERE ApplyUserID = @ApplyUserID

诸如:带 IN 关键字的SQl,单个参数中不含逗号,如:  'A,B,C',或者参数含逗号,如 'a1,b1','a2,b2','a3,b3',采用如下方式去执行Sql,则为失败;若采用Trim('\'') 去掉首尾单引号,仍然失败。(采用 ExecuteScalar 去获取值,不报错,单结果为 0,正常应该为2)

 SELECT COUNT(*) FROM A  WHERE ApplyUserID IN(@ApplyUserID)

尝试了许久,最终改用占位符 { 0 } 解决,注: 普通占位符加单引号,IN 后面则不需要

 SELECT COUNT(*) FROM A  WHERE ApplyUserID IN({0}) AND NAME = '{1}'

其实占位符还有一个好处,由于之前写的储存过程中涉及的参数 @ApplyUserID 和 @Name 用到了多次,若使用字符串拼接觉得比较丑(小小的强迫症),若采用@Parameter 则需要定义很多变量,因为SQL中 Parameter 变量不能重复,而且碰到 IN 这种弯弯,绕起来又比较麻烦,故用占位符 {0} ,实际上操作起来很方便,对于sql中出现多次 @ApplyUserID 用 {0} 代替,@Name用 {1} 代替即可。占位符无关次数。

ado.net 参数传递之 in的更多相关文章

  1. ADO.NET 帮助类 参数传递 存储过程 分页

    SQLHelper public class SqlHelper { private readonly string _constr = ConfigurationManager.Connection ...

  2. C# ADO.NET SqlDataAdapter中传递参数

    ADO.NET的SQL语句中,往往不是静态的语句,而是需要接受传递过来的参数,比如典型的登录功能,需要查找指定的用户名: string sqlQuery = "SELECT * FROM W ...

  3. ADO.NET事务处理,初始回调函数,多张表的数据在同一个DataGridView中展示

    执行ADO.NET事务包含四个步骤,接下来以Transaction对象为例介绍. (1)调用SQLConnection对象的BeginTransaction()方法,创建一个SQLTransactio ...

  4. .NET基础操作回顾_使用ADO.NET操作SqlServer使用的类

    有些工具用的久了或者有新工具出现后,就慢慢的遗忘了很多,它们从熟悉的变成陌生,当然,对于我们来说不是好事吧. 今天回顾一下ADO.NET用到的MS的基础类库,先上代码(标准的SqlServer操作) ...

  5. ado.dataset

    DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖与数据库的独立数据集合.所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是 ...

  6. 从一个Bug说开去--解决问题的思路,Linked Server, Bulk Insert, DataTable 作为参数传递

    声名— 部分内容为杜撰,如有雷同,不胜荣幸! 版权所有,如要引用,请标明出处! 如果打赏,请自便! 1       背景介绍 最近一周在忙一个SQL Server 的Bug,一个简单的Bug,更新两张 ...

  7. ADO面板上的控件简介

    ADO面板上的控件简介 一. TADOConnection组件该组件用于建立数据库的连接.ADO的数据源组件和命令组件可以通过该组件运行命令及数据库中提取数据等.该组件用于建立数据库的连接,该连接可被 ...

  8. C# 6 与 .NET Core 1.0 高级编程 - 37 章 ADO.NET

    译文,个人原创,转载请注明出处,有不对的地方欢迎指出与交流. 英文原文:Professional C# 6 and .NET Core 1.0 - 37 ADO.NET --------------- ...

  9. Delphi7 ADO面板上的控件简介

    ? ADO Connection的主要方法:1) Begin Trans    开始启动一个新的事务,必须保证数据连接处于激活状态.2) Cancel    关闭于数据库的连接.3) Commit T ...

随机推荐

  1. api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?

    api接口写好了?想过(Accept,Content-Type)?返回类型json|xml? 起因: - A,B. A调用B提供的api接口. - A:为毛你的接口返回的是xml格式的(浏览器访问)? ...

  2. 关于解决Git项目本地修改代码之后执行pull操作之后报错的问题

    解决办法: 注意!该方法执行后会导致远程仓库覆盖本地仓库的文件,如果不需要对本地文件进行保存,可以无视,若之后还需要用到,请备份所报错文件! 1.Eclipse中选中项目右键-->Team--& ...

  3. Zabbix如何实现批量监控端口状态

    引言 ------------------------------------------------------------------------------------------------- ...

  4. excel数据导出新妙招

    之前在做项目的时候需要将数据库中的数据导出为excel表格一遍打印查阅,在网上找了很多插件也没有找到自己理想的好用的插件(也就是说没有找到令我满意的插件),最近在学习a标签的相关知识时理解到,a标签不 ...

  5. 番外篇--Moddule Zero安装

    Moddule Zero 安装 1.2.1 从模板创建 使用ABP和module-zero开始一个新项目最简单的方式是使用启动模板.详细了解请参考启动模板文档. 1.2.2 手动安装 如果你有一个预先 ...

  6. Mac 终端 shell 公钥失效解决办法

    mac的终端下面使用ssh user@localhost输入密码不能正常登录解决   今天回来后发现系统突然很奇怪,以前在mac的终端下面使用ssh user@localhost输入密码就可以连接到远 ...

  7. TIJ笔记:内部类的初始化

    看编程思想有点时间了,看到了些在马士兵老师没有讲过的部分,所以打算记录一下 内部类的初始化: .内部类的初始化和外部类的初始化略有不同,可以使用 外部类对象.new 内部类对象 创建内部类对象 pac ...

  8. vim 的各种用法,很实用哦,都是本人是在工作中学习和总结的

    (一)初级个性化配置你的vim 1.vim是什么? vim是Vi IMproved,是编辑器Vi的一个加强版,一个极其强大并符合IT工程师(程序员.运维)习惯的编辑器.如果你是一名职业的SE,那么一定 ...

  9. APACHE服务器出现No input file specified.的完美解决方案

    转自:http://www.upupw.net/server/n53.html 启用REWRITE的伪静态功能的时候,首页可以访问,而访问内页的时候,就提示:"No input file s ...

  10. ubuntu-apache下隐藏thinkphp入口文件index.php

    按照thinkphp手册中来讲,apache服务器下,隐藏thinkphp入口文件有3步: httpd.conf配置文件中加载了mod_rewrite.so模块 AllowOverride None ...