none
关于 linq 与存储过程的问题,求教高手 RRS feed

  • 问题

  •  在运行程序的时候发现一个列名为“合同金额1”的自定义列根本无法显示(在datagridview里看不到这一列,但用SQL的查询分析器运行存储过程却可以),然而checkbox3经测试是已经钩上了(且中断查看运行时的 filterusermoney和 filterarea都有值的存在),是不是SQL存储过程与C#程序之间在一些bug还是别的问题?请高手指教一下。谢谢!

    C#代码如下:

    this.GridView1.Enabled = false;

    string filterarea = "";
                string filterusermoney = "";
    DataClasses1DataContext selldb = new DataClasses1DataContext();
                DataClasses1DataContext db1 = new DataClasses1DataContext();
                var cuuser = from a in db1.users
                             where a.id.ToString().Trim() == HttpContext.Current.Session["id"].ToString().Trim()
                             select a;
                if (CheckBox2.Checked == true)//区域过滤
                {               
                    filterarea = cuuser.First().area;
                }
                if (CheckBox3.Checked == true)//金额权限制约显示
                {
                    filterusermoney = cuuser.First().realname;
                }       

               this.GridView1.DataSource = selldb.exceedCreditlinkuserfilter(filterarea, DateTime.Parse(this.TextBox1.Text), DateTime.Parse(this.TextBox2.Text), filterusermoney);

                this.GridView1.DataBind();
                this.Label1.Text = this.Label1.Text + "+1";

                this.GridView1.Enabled = true;

    SQL存储过程如下:

    ALTER PROCEDURE [dbo].[exceedCreditlinkuserfilter]
    (  @filterarea AS nvarchar(50),
     @filterdateb as date,
    @filterdatee as date,
    @filterusermoney as nvarchar(50)
    )
    as
    BEGIN


      -- routine body goes here, e.g.
      -- SELECT 'Navicat for SQL Server'
    if (DATALENGTH(ltrim(rtrim(@filterarea)))=0 and DATALENGTH(ltrim(rtrim(@filterusermoney)))=0)
    begin
    select * from exceedCreditlinkuser as a WHERE
    a.[当前日期]>@filterdateb and a.[当前日期]<@filterdatee 
    end


    else if (DATALENGTH(ltrim(rtrim(@filterarea)))>0 and DATALENGTH(ltrim(rtrim(@filterusermoney)))=0)
    begin 
    select * from exceedCreditlinkuser as a WHERE
    a.[当前日期]>@filterdateb and a.[当前日期]<@filterdatee and 
    (ltrim(rtrim(a.area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b1area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b2area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b3area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b4area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b5area))=ltrim(rtrim(@filterarea))) 
    end


    else if (DATALENGTH(ltrim(rtrim(@filterarea)))=0 and DATALENGTH(ltrim(rtrim(@filterusermoney)))>0)
    begin
    select 
    a.[合同代码],
    a.[是否完毕],
    a.[是否是新结算条款],
    a.[合同日期],
    a.[合同金额],
    '合同金额1'=
    case
    when (ltrim(rtrim(a.[销售员]))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b1realname))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b2realname))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b3realname))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b4realname))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b5realname))=ltrim(rtrim(@filterusermoney))) then CONVERT(nvarchar(50),a.[合同金额])
    else '没有权限显示'
    end,
    a.[工程名称],
    a.[销售员],
    a.[往来户代码],
    a.[往来户名称],
    a.[往来户等级],
    a.[是否已末批发货],
    a.[总发货],
    a.[上海工地开票],
    a.[上海建筑开票],
    a.[天津工地开票],
    a.[江门工地开票],
    a.[泛公司开票],
    a.[加工其他开票],
    a.[总开票],
    a.[预收款],
    a.[总收款],
    a.[当前日期],
    a.[预收款是否超信],
    a.[预收款应收款],
    a.[批结是否超信],
    a.[批结应收款],
    a.[末批是否超信],
    a.[末批应收款],
    a.[累计发货是否超信],
    a.[超累计发货应收款],
    a.[最大应收款],
    a.[超信角色],
    a.area,
    a.b1id,
    a.b1realname,
    a.b1area,
    a.b2id,
    a.b2realname,
    a.b2area,
    a.b3id,
    a.b3realname,
    a.b3area,
    a.b4id,
    a.b4realname,
    a.b4area,
    a.b5id,
    a.b5realname,
    a.b5area
    from exceedCreditlinkuser as a WHERE
    a.[当前日期]>@filterdateb and a.[当前日期]<@filterdatee 

    end

    else if (DATALENGTH(ltrim(rtrim(@filterarea)))>0 and DATALENGTH(ltrim(rtrim(@filterusermoney)))>0)
    begin
    select 
    a.[合同代码],
    a.[是否完毕],
    a.[是否是新结算条款],
    a.[合同日期],
    a.[合同金额],
    '合同金额1'=
    case
    when (ltrim(rtrim(a.[销售员]))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b1realname))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b2realname))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b3realname))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b4realname))=ltrim(rtrim(@filterusermoney)) or ltrim(rtrim(a.b5realname))=ltrim(rtrim(@filterusermoney))) then CONVERT(nvarchar(50),a.[合同金额])
    else '没有权限显示'
    end,
    a.[工程名称],
    a.[销售员],
    a.[往来户代码],
    a.[往来户名称],
    a.[往来户等级],
    a.[是否已末批发货],
    a.[总发货],
    a.[上海工地开票],
    a.[上海建筑开票],
    a.[天津工地开票],
    a.[江门工地开票],
    a.[泛公司开票],
    a.[加工其他开票],
    a.[总开票],
    a.[预收款],
    a.[总收款],
    a.[当前日期],
    a.[预收款是否超信],
    a.[预收款应收款],
    a.[批结是否超信],
    a.[批结应收款],
    a.[末批是否超信],
    a.[末批应收款],
    a.[累计发货是否超信],
    a.[超累计发货应收款],
    a.[最大应收款],
    a.[超信角色],
    a.area,
    a.b1id,
    a.b1realname,
    a.b1area,
    a.b2id,
    a.b2realname,
    a.b2area,
    a.b3id,
    a.b3realname,
    a.b3area,
    a.b4id,
    a.b4realname,
    a.b4area,
    a.b5id,
    a.b5realname,
    a.b5area
    from exceedCreditlinkuser as a WHERE
    a.[当前日期]>@filterdateb and a.[当前日期]<@filterdatee and 
    (ltrim(rtrim(a.area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b1area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b2area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b3area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b4area))=ltrim(rtrim(@filterarea)) or ltrim(rtrim(a.b5area))=ltrim(rtrim(@filterarea))) 

    end
    END

                                      


    2012年3月6日 0:56

答案

全部回复

  •     您好,基于您的代码,若存储过程查询结果是包含那一列,但绑定至gridview后无法显示那一列,问题应该出现在数据元的绑定上,建议您到ASP.NET论坛去咨询一下,那里有更多ASP.NET的专家,相信他们能够帮到您。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    2012年3月7日 3:23
    版主
  • 我把我原来的代码 

     this.GridView1.DataSource = selldb.exceedCreditlinkuserfilter(filterarea, DateTime.Parse(this.TextBox1.Text), DateTime.Parse(this.TextBox2.Text), filterusermoney);

    替换成.net2.0时代的代码就正常了,这是不是说明.net4.0在linq方面有bug?

    DataTable temptb=new DataTable();

     string sqlcom = "exec exceedCreditlinkuserfilter '" + filterarea + "','" + this.TextBox1.Text + "','" + this.TextBox2.Text + "','" + filterusermoney+"'";

                System.Data.SqlClient.SqlDataAdapter sqlad = new System.Data.SqlClient.SqlDataAdapter(sqlcom, selldb.Connection.ConnectionString);
                sqlad.Fill(temptb);

      DataColumn[] keys = new DataColumn[1]; 
                keys[0] = temptb.Columns[0];
                temptb.PrimaryKey = keys;//设置主键

    this.GridView1.DataSource = temptb;

    2012年3月7日 3:52
  • 您好,您可以添加断点调试一下,用LINQ查询出结果后先不要帮定,看下查询到的结果是否正确,若查询结果正确,绑定后显示不正确,问题就出在数据绑定上。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    2012年3月8日 3:21
    版主
  • 你好,我尝试过把  selldb.exceedCreditlinkuserfilter(filterarea, DateTime.Parse(this.TextBox1.Text), DateTime.Parse(this.TextBox2.Text), filterusermoney);的结果转换成static datatable类型 ,然后再把这个datatable 指向gridview的datasource里,结果还是少了一列,因此我也不确定是不是linq的问题还是datagrid 的问题,但用.net2.0时代的老方法确实可行。

    this.GridView1.DataSource =

    2012年3月8日 5:40
  • 您的意思是Linq语句查询出的结果本来就少一列吗?


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    2012年3月9日 2:35
    版主
  • 是的,但我不确定是哪里出问题了,还是bug来的。

    如果你们有条件可以写个类似的存储过程试一试。

    • 已编辑 hzpemu 2012年3月9日 5:03
    2012年3月9日 5:02
  • 您好,我觉得有可能是逻辑控制上出了问题,在你的存储过程中,有很多if语句,您可以用SQL Profiler去看一下当参数传进之后,数据库真正执行的命令是什么,是不是您想要得到的命令。

    您可以参阅一下这个链接 : http://msdn.microsoft.com/zh-cn/library/bb386946.aspx 

    链接介绍了各种Linq to SQL调用存储过程的情况。


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    2012年3月12日 7:40
    版主