代码之家  ›  专栏  ›  技术社区  ›  napi15

为什么查询使用dapper将一些空值返回给我的列表对象

  •  1
  • napi15  · 技术社区  · 7 年前

    我有一个函数查询,出于安全考虑,我只使用了虚拟表名:

    SELECT 
    h.CENID,
     h.BMHFMC, 
     h.BMHDONEMIDASSTEP1, 
     h.BMHDONEMIDASSTEP2,
     h.LMIID, 
     h.BMHHOLD,
     h.BMHBATCHMIDAS,
     h.BMHFMCVALUEDATE AS HeaderValueDate, 
     h.SUNID, 
     h.BRAID,
     d.BMHID, 
     d.BMDRUBRIQUE,
     d.BMDCLIENT,
     d.BMDSEQUENCE,
     d.BMDDATE, 
     d.BMDDEVISE, 
     d.BMDMONTANT,
     d.BMDTYPE, 
     d.BMDNOTE, 
     d.BMDENTRYNBRE,
     v.DEVDECIMAL ,
     NVL(t.TYPVERIFCOMPTEMIDAS, 0) AS TYPVERIFCOMPTEMIDAS 
     FROM dbo.TableOne h 
     INNER JOIN dbo.Tabletwoo d
     ON h.BMHID = d.BMHID 
     INNER JOIN dbo.tableThree v
     ON d.BMDDEVISE = v.DEVID 
     LEFT JOIN dbo.TableFour t 
     ON  t.TYPID=h.BMHFMC  
     WHERE d.BMDMONTANT != 0 
     AND h.BMHDONEMIDASSTEP1 = 0
     AND h.BMHDONEMIDASSTEP2 = 0 
     AND h.LMIID = 0 
     AND h.BMHHOLD = 0 
    

    我创建了一个类来绑定每个字段

     public class Batch :BaseRepository ,IList<Batch>
        {
            public Batch()
            {
            }
    
            private string cendid;
            private string bmhfmc;
            private double bmhdonemidasstep1;
            private double bmhdonemidasstep2;
            private double lmiid;
            private double bmhhold;
            private double bmhbatchmidas;
            private DateTime headervaluedateordinal;
            private double sunid; // 
            private string bradid; //
            private double bmhid;
            private string bmdrubirique; //
            private string bmdclient;
            private string bmdsequence;
            private DateTime bmddate;
            private string bmddevise;
            private double bmdmontant;
            private string bmdtype;
            private string bmdnote;
            private string bmdentrynbre; //
            private double devdecimalordinal;
            private double typverifcomptemidasordinal;
    
            public Batch(string cendid, string bmhfmc, double bmhdonemidasstep1, double bmhdonemidasstep2, double lmiid, double bmhhold, double bmhbatchmidas, DateTime headervaluedateordinal, double sunid, string bradid, double bmhid, string bmdrubirique, string bmdclient, string bmdsequence, DateTime bmddate, string bmddevise, double bmdmontant, string bmdtype, string bmdnote, string bmdentrynbre, double devdecimalordinal, double typverifcomptemidasordinal)
            {
                this.cendid = cendid;
                this.bmhfmc = bmhfmc;
                this.bmhdonemidasstep1 = bmhdonemidasstep1;
                this.bmhdonemidasstep2 = bmhdonemidasstep2;
                this.lmiid = lmiid;
                this.bmhhold = bmhhold;
                this.bmhbatchmidas = bmhbatchmidas;
                this.headervaluedateordinal = headervaluedateordinal;
                this.sunid = sunid;
                this.bradid = bradid;
                this.bmhid = bmhid;
                this.bmdrubirique = bmdrubirique;
                this.bmdclient = bmdclient;
                this.bmdsequence = bmdsequence;
                this.bmddate = bmddate;
                this.bmddevise = bmddevise;
                this.bmdmontant = bmdmontant;
                this.bmdtype = bmdtype;
                this.bmdnote = bmdnote;
                this.bmdentrynbre = bmdentrynbre;
                this.devdecimalordinal = devdecimalordinal;
                this.typverifcomptemidasordinal = typverifcomptemidasordinal;
            }
    
            public string Cendid
            {
                get { return cendid; }
                set { cendid = value; }
            }
    
            public string Bmhfmc
            {
                get { return bmhfmc; }
                set { bmhfmc = value; }
            }
    
            public double Bmhdonemidasstep1
            {
                get { return bmhdonemidasstep1; }
                set { bmhdonemidasstep1 = value; }
            }
    
            public double Bmhdonemidasstep2
            {
                get { return bmhdonemidasstep2; }
                set { bmhdonemidasstep2 = value; }
            }
    
            public double Lmiid
            {
                get { return lmiid; }
                set { lmiid = value; }
            }
    
            public double Bmhhold
            {
                get { return bmhhold; }
                set { bmhhold = value; }
            }
    
            public double Bmhbatchmidas
            {
                get { return bmhbatchmidas; }
                set { bmhbatchmidas = value; }
            }
    
            public DateTime Headervaluedateordinal
            {
                get { return headervaluedateordinal; }
                set { headervaluedateordinal = value; }
            }
    
            public double Sunid
            {
                get { return sunid; }
                set { sunid = value; }
            }
    
            public string Bradid
            {
                get { return bradid; }
                set { bradid = value; }
            }
    
            public double Bmhid
            {
                get { return bmhid; }
                set { bmhid = value; }
            }
    
            public string Bmdrubirique
            {
                get { return bmdrubirique; }
                set { bmdrubirique = value; }
            }
    
            public string Bmdclient
            {
                get { return bmdclient; }
                set { bmdclient = value; }
            }
    
            public string Bmdsequence
            {
                get { return bmdsequence; }
                set { bmdsequence = value; }
            }
    
            public DateTime Bmddate
            {
                get { return bmddate; }
                set { bmddate = value; }
            }
    
            public string Bmddevise
            {
                get { return bmddevise; }
                set { bmddevise = value; }
            }
    
            public double Bmdmontant
            {
                get { return bmdmontant; }
                set { bmdmontant = value; }
            }
    
            public string Bmdtype
            {
                get { return bmdtype; }
                set { bmdtype = value; }
            }
    
            public string Bmdnote
            {
                get { return bmdnote; }
                set { bmdnote = value; }
            }
    
            public string Bmdentrynbre
            {
                get { return bmdentrynbre; }
                set { bmdentrynbre = value; }
            }
    
            public double Devdecimalordinal
            {
                get { return devdecimalordinal; }
                set { devdecimalordinal = value; }
            }
    
            public double Typverifcomptemidasordinal
            {
                get { return typverifcomptemidasordinal; }
                set { typverifcomptemidasordinal = value; }
            }
    

    现在,当我使用dapper在列表中执行查询时

    Connection conn = new Connection();
     OracleConnection connection = conn.GetDBConnection();
      myList= connection.Query<Batch>(querySql).ToList();
    

    现在,在调试时,所有字段都返回预期值。但是,我注意到下面的字段是 null 在里面 myList 不是空的而是真的 无效的 ,但问题是它们在数据库中不为null

    Bmdrubirique , Sunid, Bmdentrynbre, Bradid ,Cenid
    

    在oracle数据库中,这些字段如下所示:

    CENID is VARCHAR2(3 BYTE)` 
    Bmhid is VARCHAR2(3 BYTE) 
    Sunid is NUMBER(38,0)
    Bradid is VARCHAR2(3 BYTE)
    

    我不明白,哪里出错了?为什么其他字段在返回时正确加载 无效的 价值

    1 回复  |  直到 7 年前
        1
  •  1
  •   Marc Gravell    7 年前

    我的默认假设是,实际代码中有一个输入错误,构造函数正在将一个值从字段分配给自身。然而,坦率地说:既然你有一个 public Batch() {} 构造函数,我不确定第二个的好处是什么——它只是增加了出错的风险。字段和手动属性也是如此。

    如果这是我,你现在有(简化为两个属性):

    public class Batch
    {
        private string cendid;
        private string bmhfmc;
        public Batch() {}
        public Batch(string cendid, string bmhfmc)
        {
            this.cendid = cendid;
            this.bmhfmc = bmhfmc;
        }
    
        public string Cendid
        {
            get { return cendid; }
            set { cendid = value; }
        }
    
        public string Bmhfmc
        {
            get { return bmhfmc; }
            set { bmhfmc = value; }
        }
    }
    

    我实际上只是:

    public class Batch
    {
        public string Cendid {get;set;}
        public string Bmhfmc {get;set;}
    }
    

    所有其余的代码都是犯编码错误的机会。

    现在:原因是 Cendid null 是因为:列是 CENID -只有一个 d . 这意味着dapper甚至没有使用自定义构造函数,因为它不是构造函数和列之间的完美匹配。其他字段也一样,如 BRAID vs BRADID .

    所以下一步要做的是修复拼写错误。