【问题标题】:Why Query returns some null values to my list Object using dapper为什么 Query 使用 dapper 向我的列表对象返回一些空值
【发布时间】:2018-05-22 01:10:01
【问题描述】:

我有这个功能查询,出于安全考虑,我只使用了虚构的表名:

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();

现在,在调试时,所有字段都返回预期值。但是,我注意到myList 中的null 不是空的,而是真正的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)

没看懂,哪里出错了?为什么其他字段在返回 null 值时正确加载?

【问题讨论】:

    标签: c# orm mapping dapper


    【解决方案1】:

    我的默认假设是实际代码中存在拼写错误,并且构造函数正在将字段中的值分配给自身。然而,坦率地说:既然你有一个 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;}
    }
    

    所有其余的代码只是造成编码错误的机会。

    现在:Cendidnull 的原因是:该列是 CENID - 只有一个 d。这意味着 dapper 甚至没有使用您的自定义构造函数,因为它不是构造函数和列之间的完美匹配。与BRAIDBRADID 等其他字段相同。

    所以接下来要做的就是改正错别字。

    【讨论】:

    • 确实,这是导致问题的错字。我认为 Dapper 不关心字段名称,而只关心类型。谢谢,我对这个神奇的 ORM 了解得越多,我取得的成绩就越好。为了回答您对 getter 和 setter 的担忧,我只需右键单击并让 Resharper(一个传奇工具)为我生成它们,并省去我自己的麻烦和头痛,
    • @napi15 但是……什么头疼?自动实现的属性是 cleaner - 需要阅读的代码更少,并且行为相同
    • 是的,但是由于某种原因,我当前版本的 VS 没有自动实现属性的功能,Resharper 确实救了我的命
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2021-08-17
    • 2021-12-04
    相关资源
    最近更新 更多