程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> dapper 可空bool轉換出錯及解決方案,dapperbool

dapper 可空bool轉換出錯及解決方案,dapperbool

編輯:關於.NET

dapper 可空bool轉換出錯及解決方案,dapperbool


最近使用entityframewok生成數據庫,使用dapper來訪問數據庫,產生了一個意外的bug,下面是產生bug的示例以及解決方案。

由於用entityframework生成數據庫,默認情況entityframewok 將bool?轉換為tinyint(1),

使用dapper查詢數據時報錯(部分數據為空,部分數據不為空,且查詢出來的第一條是可為空的數據才會出現問題,否則不會報錯)。

1、定義一個類:

public class BugNullable
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public bool? IsBug { get; set; }

        public DateTime? UpdatedTime { get; set; }
    }

2、生成數據庫表

CREATE TABLE `bugnullable` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT,
    `Name` VARCHAR(50) NOT NULL DEFAULT '0',
    `IsBug` TINYINT(1) NULL DEFAULT NULL,
    `UpdatedTime` TIMESTAMP NULL DEFAULT NULL,
    PRIMARY KEY (`ID`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3
;
3、填充數據

INSERT INTO `bugnullable` (`ID`, `Name`, `IsBug`, `UpdatedTime`) VALUES
    (1, 'test', NULL, NULL),
    (2, 'test1', 1, '2017-01-14 10:05:15');

4、dapper .net 測試代碼

        class Program
    {
        static void Main(string[] args)
        {
            /// <summary>
            /// 數據庫連接串
            /// </summary>
            var connectionString = ConfigurationManager.AppSettings["DefaultConnection"].Trim();
            using (var conn = new MySqlConnection(connectionString))
            {
                //var bugs = conn.Query<BugNullable>("select * from BugNullable order by ID asc;").ToList(); no bug
                SqlMapper.GridReader gr = conn.QueryMultiple("select * from BugNullable order by ID asc;");//bug
                var bugs = gr.Read<BugNullable>().ToList();

                bugs.ForEach(h => {
                    Console.WriteLine($"ID:{h.ID},Name:{h.Name},IsBug:{h.IsBug},UpdatedTime:{h.UpdatedTime}");
                });
                conn.Close();
            }
           
            Console.ReadLine();
        }
    }

    public class BugNullable
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public bool? IsBug { get; set; }

        public DateTime? UpdatedTime { get; set; }
    }

5、結果

6、解決方案:修改數據庫字段大小(將bool對應的tinyint(1)適當擴大,如tinyint(2)或者bit(1))。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved