C#从数据库读取布尔值

C#从数据库读取布尔值,c#,mysql,datatable,boolean,C#,Mysql,Datatable,Boolean,我正在尝试从数据库中读取布尔值(已启用字段),并使用它初始化对象。我使用的是数据表: DataTable dt = new DataTable(); dt.Load(reader); List<Account> accounts = dt.AsEnumerable().Select(row => new Account { name = row.Field<string>("user") enabled = row.

我正在尝试从数据库中读取布尔值(
已启用
字段),并使用它初始化对象。我使用的是数据表:

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();
UPDATE2:更详细的错误消息

System.InvalidCastException未由用户代码处理
HResult=-2147467262消息=指定的强制转换无效。
Source=System.Data.DataSetExtensions StackTrace: 在System.Data.DataRowExtensions.Unbox`1.NullableField[TElem](对象 价值) 在System.Data.DataRowExtensions.Field[T](数据行,字符串列名) 在WebApplication5.WebService1.c.b__1_0(数据行 WebService1.asmx.cs中的行:第88行 在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中 位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 在WebService1.asmx.cs中的WebApplication5.WebService1.getUserSentPackages(字符串用户名):第87行InnerException


如注释所述,MySql中的布尔类型是TinyInt(1)的同义词。如果无法按建议更改连接字符串,则C中的等效类型为
byte
。如果数据库中可能存在空值,则应使用
字节?
(可空字节)。守则是:

enabled = row.Field<byte?>("enabled")==1
enabled=row.Field(“enabled”)==1
我通过以下方式解决了这个问题:

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

使用
字符串
而不是
对象
不起作用

启用列的SQL数据类型是什么?它可以为空吗?
`enabled`boolean default false,
,但是表中的所有行都初始化了
enabled
字段。请尝试
boolean?
。并且您的
帐户
类的
已启用的
属性也必须是
布尔属性。
在哪里尝试
布尔属性?在数据库或C#中,MySQL实际上没有bool类型,并将“bool”视为
TINYINT
的别名。真正的问题来自网络,而网络并不知道这一点。添加
;treattinyasboolean=True
转换为您的连接字符串Yes:
System.Data.dll中发生了“System.ArgumentException”类型的异常,但未在用户代码中处理
我们不知道这是在哪里发生的这是您的原始连接字符串还是上面建议的新连接字符串?这应该适用于原始连接字符串。我建议您调试并查看数据表中的值,然后再将其放入列表中。如何检查这些值?我还可以自动获取类型吗?如果在代码中设置断点,则可以单步执行。填充数据表后,将鼠标悬停在该数据表上,您将能够查看这些值。此外,除非您将其用于其他用途,否则您可以直接从数据读取器填充列表,datatable可能不是必需的。这将起作用,但它的形式很差。将(实例化)转换为字符串,然后将其与另一个字符串进行比较,感觉很明显,但这是相当大的开销。此外,这种比较根本看不出来。
enabled = "1".Equals(row.Field<Object>("enabled").ToString())
enabled = "false".Equals(row.Field<Object>("enabled").ToString())