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

时间:2023-01-07 17:07:19

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;


        }