.net System.Data.Entity中使用System.Data.SqlClient.SqlParameter作为存储过程参数读写数据注意事项

当我们用.net System.Data.Entity中的System.Data.SqlClient.SqlParameter作为存储过程参数读写数据是,有时候会遇到如下错误:

{"String[1]: the Size property has an invalid size of 0."}

看一下代码

 public List<Users> GetByFilter(string keyword, int agentId, int pageIndex, int pageSize, ref int count, ref int totalPage)
        {
            string where = " where 1=1 ";
            if(!string.IsNullOrEmpty(keyword))
            {
                where += " and   NickName like %" + keyword + "%";
            }
            if(agentId!=0)
            {
                where += " and  SpreaderID=" + agentId;
            }
            if(!string.IsNullOrEmpty(where))
            {
                where = where.Trim();
                where=where+ where.TrimStart(new char[]{ 'a','n','d'});
            }
            using (HuiYouWebDBContext db=new HuiYouWebDBContext())
            {
                var whereP=new  System.Data.SqlClient.SqlParameter
                {
                    ParameterName="@where",
                    SqlDbType=SqlDbType.NVarChar,
                    Size=200,
                    Value=where
                };
                var totalRecordP=new System.Data.SqlClient.SqlParameter
                {
                    ParameterName="@totalRecord",
                    Value = count,
                    Direction=ParameterDirection.Output
                };
                var totalPageP=new System.Data.SqlClient.SqlParameter
                {
                    ParameterName="@TotalPage",
                    Value=totalPage,
                    Direction=ParameterDirection.Output
                };
                var pageSizeP=new System.Data.SqlClient.SqlParameter
                {
                    ParameterName="@pageSize",
                    Value=pageSize
                };
                var pageIndexP=new System.Data.SqlClient.SqlParameter
                {
                    ParameterName="@pageIndex",
                    Value=pageIndex
                };
                var tableNameP=new System.Data.SqlClient.SqlParameter
                {
                    ParameterName="@tablename",
                    SqlDbType = SqlDbType.NVarChar,
                    Size = 200,
                    Value="[QPAccountsDB].[dbo].[AccountsInfo]"
                };
                  var orderFieldP=new System.Data.SqlClient.SqlParameter
                {
                    ParameterName="@orderField",
                    SqlDbType = SqlDbType.NVarChar,
                    Size = 200,
                    Value="UserID"
                };
                  var AscOrDescP=new System.Data.SqlClient.SqlParameter
                {
                    ParameterName="@AscOrDesc",
                    SqlDbType = SqlDbType.NVarChar,
                    Size = 200,
                    Value="desc"
                };

                System.Data.SqlClient.SqlParameter[] param={whereP,totalRecordP,totalPageP,pageSizeP,pageIndexP,tableNameP,orderFieldP,AscOrDescP};
                var results = db.Database.SqlQuery<Users>("exec dbo.GetList  @where, @totalRecord OUTPUT, @TotalPage OUTPUT, @pageSize, @pageIndex,@tablename,@orderField,@AscOrDesc", param);
                List<Users> list=results.ToList();
                count = Convert.ToInt32(totalRecordP.Value);
                totalPage = Convert.ToInt32(totalPageP.Value);
                return list;
            }

我们在定义一个新的参数时,如果不指定SqlDbType,也不指定Size时,也不指定Value时,会出现如下这几种情况 :

1、系统会默认地把这个参数当作字符型;

2、如果这个参数是输出型(output),则必须指定大小,不然会出现上述错误;

如果我们给这个参数赋值了,那么系统会根据赋的值来推断sql会话过程中参数应该使用的类型,如果不指定就当字符型。

只有我们显示地使用ToList方法时,这个查询才会实际地发生,不会查询不会提交到sql 实例并返回数据。

查询后,我们必须显示的给我们的ref参数赋值,定义Parameter时把实参赋值给Parameter属性只能让系统推断参数类型,并不会让其查询后赋值。

总的来说,尽量定义Parameter的类型,尽量赋值,尽量定义大小。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值