我接管了一个使用至少3年前创建的SQLite DB的C#项目的工作。先前的开发人员正在使用FireFox的某些插件来管理数据库。
接管我时,我安装了数据库浏览器并打开了数据库以添加一些新字段。当我选择修改表时,我看到许多类型的字段 BOOL当我创建新字段时,BOOL不是一种选择。我已经读过SQLite没有像t-sql这样的本地BOOL的地方,这很好。我可以轻松地将bool值保持为int 1或0。
1)但是,为什么数据库浏览器向我显示BOOL作为某些现有字段的类型?
2)为什么此C#与这些BOOL字段一起使用? rs是此SQLite表中的记录集,EnableNFCTools是显示为BOOL Type的字段之一。该代码从数据库值中正确设置了enableNFCTools变量。
bool.TryParse(string.Format("{0}", rs["EnableNFCTools"]), out enableNFCTools);
上面的代码不适用于我添加的新的INTEGER字段,现在我必须使用类似的方法从这些INTEGER字段中正确获取设置。
if ((long)rs["BadgePrintingEnabled"] == 1)
badgePrintingEnabled = true;
else
badgePrintingEnabled = false;
再次,如果确实没有BOOL类型,那么为什么数据库浏览器为什么在这个已有至少三年历史的DB中显示一些现有字段的BOOL? 为什么这些BOOL类型的C#bool处理有效?
答案 0 :(得分:0)
显然SQLite确实具有BOOL类型,它的工作方式类似于真正的DB类型的BOOL(至少在我的C#代码中)。
如果使用创建表,则可以将类型设置为BOOL,然后 数据库浏览器会将类型显示为BOOL,但是您无法将任何现有列更改为BOOL类型。
并且在C#代码中,您必须处理数据库中的BOOL列 作为BOOL类型,不作为INTERGER类型。
而NUMERIC则不像BOOL类型。 当我尝试从NUMERIC字段设置C#变量时,上面显示的两种方法都无法从数据库中获取值。
在幕后,SQLite正在使用BOOL类型做一些事情,在这里我们还不完全了解。
使用GetType()。ToString()我发现这些SQLite类型在C#中显示为以下类型: Debug.Write(rs [“要检查类型的字段”] .GetType()。ToString());
SQLite Type / C# GetType().ToString()
------------------------------------
NUMERIC = System.Decimal
INTEGER = System.Int64
BOOL = System.Boolean
是的,SQlite中确实存在BOOL类型, 或至少在C#中的行为类似于BOOL ...