c#从数据库读取布尔值

kx7yvsdv  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(552)

我在读布尔值( enabled 字段),并使用它初始化对象。我使用的是一个数据表:

DataTable dt = new DataTable();
dt.Load(reader);

List<Account> accounts = dt.AsEnumerable().Select(row =>
    new Account
    {
        name = row.Field<string>("user")
        enabled = row.Field<Boolean>("enabled")
    }).ToList();

田野 enabled 被宣布为 boolean 在mysql数据库中。在数据库中 enabled 字段定义为: enabled boolean default false, 我在试着读这本书时出错了 enabled 变量:
system.data.datasetextensions.dll中发生“system.invalidcastexception”类型的异常,但未在用户代码中处理
我得到的错误是 enabled = row.Field<Boolean>("enabled") 线路。我认为错误是c#的布尔数据类型。当我使用enabled=“1”.equals(row.field(“enabled”)enabled=row.field(“enabled”)==1时,我也遇到了同样的问题。如果我将其替换为'enabled=true',则一切正常。
更新:数据库连接:

string connString = "SERVER=localhost" + ";" +
                "DATABASE=accs;" +
                "UID=root;" +
                "PASSWORD=root;";
MySqlConnection cnMySQL = new MySqlConnection(connString);

update2:更详细的错误消息
用户代码未处理system.invalidcastexception
hresult=-2147467262 message=指定的强制转换无效。
source=system.data.datasetextensions stacktrace:at system.data.datarowextensions.unboxt1.nullablefield[telm](对象值)at system.data.datarowextensions.field[t](数据行,string columnname)位于webapplication5.webservice1。<>webservice1.asmx.cs中的c.b\u1\u0(datarow行):system.linq.enumerable.whereselectenumerableiterator2.movenext(),位于system.collections.generic.list1..ctor(ienumerable1 collection),位于system.linq.enumerable.tolist[tsource](ienumerable`1 source)webservice1.asmx.cs中的webapplication5.webservice1.getusersentpackages(字符串用户名):第87行innerexception

jbose2ul

jbose2ul1#

我通过以下方法解决了这个问题:

enabled = "1".Equals(row.Field<Object>("enabled").ToString())

如果要检查false,请使用 "false" 而不是 "1" :

enabled = "false".Equals(row.Field<Object>("enabled").ToString())

使用 String 而不是 Object 不起作用!

jaql4c8m

jaql4c8m2#

如注解中所述,mysql中的boolean类型是tinyint(1)的同义词。如果无法按建议更改连接字符串,则c#中的等效类型为 byte . 如果数据库中可能有空值,那么应该使用 byte? (可空字节)。代码是:

enabled = row.Field<byte?>("enabled")==1

相关问题