三层多表查询问题?请高手指教

Antwoord 三层多表查询问题?请高手指教

  • 2009年7月3日 8:17
     
      包含代码
            private const string select_fgtext = "select a.FGTEXTNAME,a.FGTEXTNUM,b.FGVALTEXT,a.FGTEXTDATE from fgk.fgtext a,fgk.FGVAL b where a.FGVALID = b.FGVALID and a.FGCLASSDM=:FGCLASSDM ORDER BY a.FGTEXTDATE DESC";
     
            #region 根据法规小类ID查询记录
            //根据法规小类ID查询记录
            public List<IfgtextInfo> SelectId(string Fgclassdm)
            {
                OracleParameter parm = new OracleParameter(":FGCLASSDM", OracleType.Char, 6);
                parm.Value = Fgclassdm;
    
                List<IfgtextInfo> Fgtextdm = new List<IfgtextInfo>();
    
                using (OracleDataReader rdr = OracleHelper.ExecuteReader(OracleHelper.ConnectionStringLocalTransaction, CommandType.Text, select_fgtext, parm))
                {
                    while (rdr.Read())
                    {
                        //IfgtextInfo fgtextcx1 = new IfgtextInfo(rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6), rdr.GetString(7), rdr.GetString(8), rdr.GetString(9), rdr.GetString(10), rdr.GetString(11), rdr.GetString(12), rdr.GetString(13));
                        IfgtextInfo fgtextcx = new IfgtextInfo(null, rdr.GetString(0), null, null, null, rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), null, rdr.GetString(4), null, null, null);
                        Fgtextdm.Add(fgtextcx);
                    }
                    return Fgtextdm;
                }
            }
            #endregion
    SQL语句单位执行能查到数据,可在数据层里就不行了,大家帮我看看,或者提供一个可行的方法,谢谢!!!!

全部回复

  • 2009年7月3日 8:36
     
     

    描述问题不理解
    问题重点是什么

  • 2009年7月3日 8:52
     
     
    在 VS 下断点,看参数 : FGCLASSDM 有无正常给值。
    IfgtextInfo 类, 之前使用是否正常。
    Wizard 编程网 - 博客园
  • 2009年7月3日 9:44
    版主
     
     
    你好,不行了是什么意思,是读取不到数据还是会报错,请详细描述一下
    知识改变命运,奋斗成就人生!
  • 2009年7月3日 10:27
    版主
     
     
    检查一下,你的这段代码,IfgtextInfo fgtextcx = new IfgtextInfo(null, rdr.GetString(0), null, null, null, rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), null, rdr.GetString(4), null, null, null);
                        你在构造函数里使用 类似这样的表达式:rdr.GetString(4), 你要做非空判断,这个如果为null的话,可能导致错误。
    还有你最好把错误信息贴出来,大家才能帮你分析~
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
  • 2009年7月3日 11:32
     
      包含代码

    谢谢楼上的朋友,我换种方式了,当数据库里的字段值为空时,在查询时会提示"没有数据可用于行或列",怎么解决?

            public List<IfgtextInfo> SelectId(string Fgclassdm)
            {
                int strn = Convert.ToInt32(Fgclassdm.Length);
                string select_id = null;
                OracleParameter parm = new OracleParameter(":FGCLASSDM", OracleType.Char, 9);
                
                 if (strn == 6)
                {
                    select_id = select_mid;
                    parm.Value = Fgclassdm;
                }
                else
                {
                    select_id = select_fgtext;
                    parm.Value = Fgclassdm;
                }
                //OracleParameter parm = new OracleParameter(":FGCLASSDM", OracleType.Char, 9);
                //parm.Value = Fgclassdm;
    
                List<IfgtextInfo> Fgtextdm = new List<IfgtextInfo>();
    
                using (OracleDataReader rdr = OracleHelper.ExecuteReader(OracleHelper.ConnectionStringLocalTransaction, CommandType.Text, select_id, parm))
                {
                    while (rdr.Read())
                    {
                        IfgtextInfo fgtextcx = new IfgtextInfo(
                            rdr.GetString(0).ToString(),
                            rdr.GetString(1).ToString(),
                            rdr.GetString(2).ToString(), 
                            rdr.GetString(3).ToString(),
                            rdr.GetString(4).ToString(),
                            rdr.GetString(5).ToString(),
                            rdr.GetString(6).ToString(),
                            rdr.GetString(7).ToString(),
                            rdr.GetString(8).ToString(),
                            rdr.GetString(9).ToString(),
                            rdr.GetString(10).ToString(),
                            rdr.GetString(11).ToString(),
                            rdr.GetString(12).ToString());
                        //IfgtextInfo fgtextcx = new IfgtextInfo(null, rdr.GetString(0), null, null, null, rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), null, rdr.GetString(4), null, null, null);
                        Fgtextdm.Add(fgtextcx);
    
                    }
                    return Fgtextdm;
                }
            }
    当所有字段都有值时不会出错?
  • 2009年7月3日 11:52
     
     已答复
    数据库中的此行此列为空。

    解决办法
    1 判断是否为空,不为空执行。

    代码:
    string s =dr.IsDBNull(1) == true ? "" : dr.GetString(1);
    可简写为
    string s =dr.IsDBNull(1) ? "" : dr.GetString(1);

    相当于
    string s = null;
    if(dr.IsDBNull(1) )
    {
    s="";
    }
    else
    {
    s=dr.GetString(1);
    }

    2使用GetValue
    代码
    string s = dr.GetValue(1).ToString();
  • 2009年7月5日 3:03
    版主
     
     
    。Net 2.0 提供了 Nullable<T> 很好的解决了这个问题,你可以了解一下

    知识改变命运,奋斗成就人生!