zoukankan      html  css  js  c++  java
  • 存储过程传递字符串参数不全、截断

    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;
    
    
            }
  • 相关阅读:
    POJ1611 && POJ2524 并查集入门
    POJ 2785:4 Values whose Sum is 0 二分
    POJ 2309:BST lowbit
    POJ 3692:Kindergarten 求补图的最大点独立集 头一次接触这样的做法
    POJ 3735:Training little cats 联想到矩阵相乘
    POJ 3916:Duplicate Removal 将相近的重复元素删除
    nyoj43--24 Point game(dfs)
    cf-Igor In the Museum (dfs)
    8VC Venture Cup 2016 -- Elimination Round Tutorial 626B
    蓝桥杯
  • 原文地址:https://www.cnblogs.com/xiaochun126/p/4167649.html
Copyright © 2011-2022 走看看