当我们用.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的类型,尽量赋值,尽量定义大小。