【发布时间】:2018-01-06 20:14:55
【问题描述】:
我正在尝试从数据库中读取一个布尔值(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在mysql数据库中被声明为boolean。
在数据库中,enabled 字段定义为:enabled boolean default false,
尝试读取enabled 变量时出现错误:
“System.InvalidCastException”类型的异常发生在 System.Data.DataSetExtensions.dll 但未在用户代码中处理
我在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=指定的转换无效。
源 = System.Data.DataSetExtensions StackTrace: 在 System.Data.DataRowExtensions.UnboxT`1.NullableField[TElem](对象 价值) 在 System.Data.DataRowExtensions.Field[T](DataRow 行,字符串 columnName) 在 WebApplication5.WebService1.c.b__1_0(DataRow 行)在 WebService1.asmx.cs:第 88 行 在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 在 System.Collections.Generic.List`1..ctor(IEnumerable`1 集合) 在 System.Linq.Enumerable.ToList[TSource](IEnumerable`1 源) 在 WebService1.asmx.cs:line 87 InnerException 中的 WebApplication5.WebService1.getUserSentPackages(String userName) 处
【问题讨论】:
-
启用列的 SQL 数据类型是什么?它可以为空吗?
-
`enabled` boolean default false,,但表中的所有行都初始化了enabled字段。 -
试试
Boolean?。并且您的Account类的enabled属性也必须是Boolean?。 -
去哪里试试
Boolean?在数据库中还是在 C# 中? -
MySQL 实际上没有 bool 类型,并将“bool”视为
TINYINT的别名。真正的问题来自不知道这一点的 NET。将;treattinyasboolean=True添加到您的连接字符串以进行转换
标签: c# mysql datatable boolean