存储过程传递字符串参数不全、截断

1、问题描述

存储过程GetTableCompare,三个参数输入参数

1.1 、传入条件参数: and myclassdate between ‘2014-12-01‘ and ‘2014-12-31‘  and classname like ‘%夜班%‘  and deptid in

(1,2,3,4,5,8,9,11,13,14,18,19,20,21,23,25,26,27,28,29,30,31,32,33,34)

通过代码调用时,总是报语法错误(少))

GetTableCompare
‘%早班%‘ and deptid in (1,2,3,4,5,8,9,11,13,14,18,19,20,21,23,25,26,27,28,29,30,31,32,33,3 group by 部门,classname order by classnam‘

附近有语法错误。字符串

‘%早班%‘ and deptid in (1,2,3,4,5,8,9,11,13,14,18,19,20,21,23,25,26,27,28,29,30,31,32,33,3 group by 部门,classname order by classname,部门‘

后的引号不完整。

1.2 、条件参数修改为:and my and myclassdate between ‘2014-12-01‘ and ‘2014-12-31‘   and deptid in

(1,2,3,4,5,8,9,11,13,14,18,19,20,21,23,25,26,27,28,29,30,31,32,33,34)    ,正确执行不报错

procedure [dbo].[GetTableCompare](@dtTime datetime,@strW nvarchar(1000),@Flag int)

1.3 、以下是调用代码

       //信息统计
        public static DataTable GetCompare(DateTime dt, string strW,int type)
        {//调用存储过程
            OleDbParameter[] parameters = new OleDbParameter[3];
            parameters[0] = new OleDbParameter("@dtTime", OleDbType.VarChar);
            parameters[0].Value = dt.ToString("yyyy-MM-dd");

            parameters[1] = new OleDbParameter("@strW", OleDbType.VarChar);
            parameters[1].Value = strW;
            parameters[2] = new OleDbParameter("@type", OleDbType.Integer);
            parameters[2].Value = type;

            DataSet ds = DB.OleDbHelper.GetDataSet("GetTableCompare", CommandType.StoredProcedure, parameters);
            if (ds != null && ds.Tables.Count > 0)
            {
                return ds.Tables[0];
            }
            return null;

        }

2、分析

实际跟踪传入的条件strW,并没有少),语法是正确的

再次打开Sql Server Profile跟踪存储过程的执行,发现条件语句少了)

可能原因:

传入的语言类型为varchar类型,是可变长的非Unicode字符,存储输入数据字节的实际长度,例如 数据:我们1234,存储长度为2*2+4=8

而parameters[1].Size 是根据parameters[1].Value值推算的,在输入非Unicode字符时推算正确,而输入了中文后,推算的值小于实际传入的值,所以字符串被截断

这也就是传入的条件参数中仅仅包含了中文“夜班”时才报错

3、解决方法

方法一,输入参数使用OleDbType.LongVarWChar方法二:自己设定size  parameters[1].Size = 500; 
 public static DataTable GetCompare(DateTime dt, string strW,int type)
        {
            if (!string.IsNullOrEmpty(Global.Params.strDeptIDs)) strW += " and deptid in (" + Global.Params.strDeptIDs + ") ";

            //调用存储过程
            OleDbParameter[] parameters = new OleDbParameter[3];
            parameters[0] = new OleDbParameter("@dtTime", OleDbType.VarChar);
            parameters[0].Value = dt.ToString("yyyy-MM-dd");

            parameters[1] = new OleDbParameter("@strW", OleDbType.LongVarWChar);  //方法一,输入参数使用OleDbType.LongVarWChar
            parameters[1].Value = strW;
            //parameters[1].Size = 500;    //方法二,自己设定size

            parameters[2] = new OleDbParameter("@type", OleDbType.Integer);
            parameters[2].Value = type;
            DataSet ds = DB_Contrast.DB.OleDbHelper.GetDataSet("GetTableCompare", CommandType.StoredProcedure, parameters);
            if (ds != null && ds.Tables.Count > 0)
            {
                return ds.Tables[0];
            }
            return null;

        }
时间: 2024-10-25 04:25:22

存储过程传递字符串参数不全、截断的相关文章

jQuery 之 setTimeout 传递字符串参数报错

当你打算调用一些jQuery代码显示隐藏的一个元素,并调用setTimeout()在一段延时之后设置其HTML的内容: 整个页面的代码是这样的. <span style="font-size:18px;"><html> <head> <title></title> </head> <body> <a href="#" id='heihei' onclick="show

JS函数传递字符串参数(符号转义)

原文链接:https://blog.csdn.net/Myname_China/article/details/82907965 JS函数传递字符串参数,如果没有转义处理,在接收的时候无法正确的接收字符串. 在双引号内 <a href="javascript:orderDetails(\''+orderId+'\')">查看详情</a> <a href="javascript:void(0)" onclick="orderDe

Oracle IN 传递字符串参数查询失效

在写存储过程中有如下代码: FOR a IN ( SELECT a.svo_no,a.AUDIT_NO,a.order_id FROM TT_PI_MODEL_REL a ) LOOP SELECT COUNT(1) INTO V_FLAG FROM TT_PI_ORDER WHERE pi_id IN (a.order_id) AND REGULARIZA_DATE IS NOT NULL ; //执行若干操作 END LOOP; 其中  SELECT a.svo_no,a.AUDIT_NO,

mysql存储过程中字符串参数单引号

注意:存储过程中单引号  ,四个单引号 SET @sql = CONCAT('select user_id into ',m_user_id,' from go_user where mobile =','''',p_user_name,'''',' AND password=','''',p_password,'''');

使用AFN 发出请求并传递json字符串参数遇到的一点问题

一. 问题描述:在使用AFN的GET请求, 在传递参数的时候,由于参数是字典类型的,并且AFN的GET方法的params参数是一个字典,如果参数嵌套着字典时, 当你 传参时会发现返回的是空的JSON数据, 并且报参数为空的错误(Xcode并不报错, 返回的数据中报错), 很明显是语法问题. 二. 解决思路:由于是语法错误,所以问了后台,发现后台需要的不是json数据,而是字符串格式的数据,如果直接把json字典作为参数传递,就是直接把json发给了后台,后台是不接受的. 三. 解决方法:所以应该

SqlServer存储过程传入Table参数

今天是周日,刚好有空闲时间整理一下这些天工作业务中遇到的问题. 有时候我们有这样一个需求,就是在后台中传过来一个IList<类>的泛型集合数据,该集合是某个类的实例集合体,然后将该集合中的实例的数据一个个地插入到数据库或者更新到数据库中去.一开始我想到的方法是拼接字符串,然后通过存储过程对接收到的字符串进行截取,再一个个地插入或者更新到数据库中去,这是最原始的方法,不过过程会比较复杂,想到这就头疼.后来查找发现说SqlServer2008中为存储过程添加了一个新特性,可以传递表类型的参数,既然

URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致

下午,计划2个小时搞定,个人官网第6次升级,就可以干点轻松的事了,结果,下午多搞了2个小时,晚上又搞了2个小时,才搞定. 最后一个世界难题是,URL传递中文参数. 问题大致是这么出现的:我为"博客雷观" 这个栏目,增加了"全文搜索"功能,用lucene实现的.因此,需要传递中文参数.搜索框表单提交,传递中文,很简单就搞定了. 搜索之后的分页url,需要带上当前的"搜索词" ,比如"程序员",我在本地很轻松就搞定了.无非就是这样

url 传递中文参数乱码问题的终极解决方法。

估计很多人在做web开发的时候,都会碰到过url传递中文参数,有时候会出现乱码的问题,但有些项目或者环境,又不会有问题.当遇到乱码的时候,上网找了很多解决方案,比如: 页面设置它的编码方式,改成utf-8 或者gb2312. encodeURI(url),也有人说要2个encodeURI,如:window.location.href = encodeURI('b.html?cId='+id+"&cName="+encodeURIComponent(name)); 然后后台Str

MSSQL中存储过程的可选参数的定义和使用

可选参数的存在,可以极大的降低代码的重复冗余.在数据库开发中,也是如此.现在针对MSSQL中存储过程的可选参数的定义和使用进行基本的介绍,留作备忘. #准备工作: 在db_test中建立一张测试表T_test: USE db_test; CREATE TABLE dbo.T_test ( Id  INT  IDENTITY(1,1) NOT NULL ,Name  NVARCHAR(20)  NOT NULL ,Sex  BIT  DEFAULT(0) ); 插入一些数据: INSERT INT