当前位置:编程学习 > C#/ASP.NET >>

linq执行存储过程返回记录集问题

按这个帖子http://www.cnblogs.com/mahong/archive/2008/09/13/1290335.html做的
存储过程
==============================
CREATE           PROCEDURE wsj_kc 
@vsl varchar(200)
AS
declare @sqlstr varchar(1500)
BEGIN
 SET NOCOUNT ON;
 set @sqlstr='select 品名,  规格, 单位,生产厂家,数量, 进货单价,进货金额, 批号 from ( SELECT     I.cInvName  AS 品名, I.cInvStd  AS 规格,CU_M.cComUnitName AS 单位,    i.cEnterprise  AS 生产厂家, (cs.iQuantity)     as 数量,     max(pu_VenInvPriceList.itaxunitprice) as 进货单价, max(cs.iQuantity * pu_VenInvPriceList.itaxunitprice)  as 进货金额,cs.cBatch  as 批号      FROM V_CurrentStock CS INNER JOIN    Inventory I ON I.cInvCode = CS.cInvCode LEFT OUTER JOIN      pu_VenInvPriceList ON I.cVenCode = pu_VenInvPriceList.cVenCode AND      I.cInvCode = pu_VenInvPriceList.cInvCode LEFT OUTER JOIN      Vendor v1 ON CS.cvmivencode = v1.cVenCode LEFT OUTER JOIN      InventoryClass IC ON IC.cInvCCode = I.cInvCCode LEFT OUTER JOIN      ComputationUnit CU_G ON       I.cSTComUnitCode = CU_G.cComunitCode LEFT OUTER JOIN      ComputationUnit CU_A ON       I.cAssComUnitCode = CU_A.cComunitCode LEFT OUTER JOIN      ComputationUnit CU_M ON        I.cComUnitCode = CU_M.cComunitCode LEFT OUTER JOIN       Warehouse W ON CS.cWhCode = W.cWhCode LEFT OUTER JOIN       v_aa_enum E ON E.EnumCode = CONVERT(nchar, CS.cMassUnit) AND        E.EnumType = N''ST.MassUnit''     WHERE   cs.iQuantity  <>0 and ' +@vsl+'  group by   I.cInvName ,I.cInvStd,  CU_M.cComUnitName,  I.cEnterprise,CS.iQuantity,CS.cBatch ) ff  group by  品名,  规格, 单位,生产厂家,数量,进货单价, 进货金额, 批号 '

exec(@sqlstr)
end
GO
====================
dbml自动生成的方法
[Function(Name="dbo.wsj_kc")]
public ISingleResult<wsj_kcResult> wsj_kc([Parameter(DbType="VarChar(200)")] string vsl)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), vsl);
return ((ISingleResult<wsj_kcResult>)(result.ReturnValue));
}
===============================
dbaccess类
public ISingleResult<wsj_kcResult> selectKc(string vcode, DateTime dt1, DateTime dt2, string invname)
        {
            List<wsj_kcResult> oKc;
            ISingleResult<wsj_kcResult> tmpIS;
            IMultipleResults tmpIm;
            IEnumerable<wsj_kcResult> tmpIe;

            try
            {
                if (invname == "" || invname == null)
                {
                    tmpIS = objDataContext.wsj_kc("1=1   and i.cVenCode='" + vcode + "'");
                }
                else
                {
                    tmpIS = objDataContext.wsj_kc("1=1   and i.cVenCode='" + vcode + "'and i.cinvname  like '%" + invname + "%' ");
                }
                //oKc = tmpIS.ToList();
                //tmpIe = tmpIm.GetResult<wsj_kcResult>();
                //oKc = tmpIm.GetResult<wsj_kcResult>().ToList();
                return tmpIS;// oKc;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
================================================
控制台调试写的调用
DAKc oDakc = new DAKc("Data Source=192.168.0.242;Initial Catalog=UFDATA_001_2010;User ID=sa;Password=sa");
            var ii = oDakc.selectKc("15js00401", new DateTime(),new DateTime(), "");
            if (ii.toList()==null)
            {
                Console.WriteLine("null");
            }else{
            foreach (wsj_kcResult i in ii)
            {
                Console.WriteLine("CustID={0}; City={1}", i.进货单价,
                i.进货金额);
            }
            }
执行到 ii.toList()就会报错,或者ii,first()等等方法只要一涉及到ii就会报"指定的转换无效",调试的话提示的是"当从一个数字执行强制转换时,值必须是一个小于无线大的数字.确保源类型可以转换为目标类型
=================================================
请问是不是存储过程执行后没有查到结果,怎么调试和修改? --------------------编程问答-------------------- if (ii == null)
{
    Console.WriteLine("null");
}else{
    foreach (wsj_kcResult i in ii)
    {
        Console.WriteLine("CustID={0}; City={1}", i.进货单价,i.进货金额);
    }
}
--------------------编程问答-------------------- 之前我就写的ii==null --------------------编程问答-------------------- 没见过这样用linq的。。。
我只知道linq直接操作数据库,
不知道还要调用存储过程。 --------------------编程问答-------------------- 呵呵,是比较生僻 --------------------编程问答-------------------- 竟然没人这么用吗? --------------------编程问答-------------------- 不用等用Linq,早在Linq出现前几年,我就不用存储过程了。 --------------------编程问答-------------------- 我也第一次见这么用,坐等告诉 --------------------编程问答-------------------- 有点乱 --------------------编程问答-------------------- 没人会吗? --------------------编程问答-------------------- csdn这么冷清了; ? --------------------编程问答-------------------- 存储过程执行的结果如果是个临时表的情况,那么linq如何调用啊?顶,求解? --------------------编程问答-------------------- Linq 填充方式是这样的。
IEnumerable<Object> obs = db.ExecuteQuery<Object>(Sql)
sql 语句查询结果集会跟据 Object 中的属性名称进行填充。
如:select '123' as a,'abc' as b,'fbi' as d from tb
则 Object 必需有属性 a,b,d 才可以得到结果。
也就是说你只要声明一个类让其与你想查询的结果集属性相对应就OK了。
补充:.NET技术 ,  LINQ
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,