我正在使用System.Data.SQLite ADO.Net Provider与SQLite DB进行交互。我使用以下语法创建了一个新表:
CREATE TABLE [tb_Replace] ([Character] CHAR(1), [Substitute] CHAR(1))
然后我尝试使用简单的选择来读取数据:
public static List<char> GetReplaceableCharacters(string connectionString)
{
List<char> replaceableCharacters = new List<char>();
SQLiteConnection sqlConnection = new SQLiteConnection(connectionString);
sqlConnection.Open();
using (SQLiteTransaction transaction = sqlConnection.BeginTransaction())
{
SQLiteCommand command = new SQLiteCommand(@"SELECT Character FROM tb_Replace", sqlConnection);
SQLiteDataReader reader = command.ExecuteReader();
while (reader.Read())
replaceableCharacters.Add((char)reader["Character"]);
}
sqlConnection.Close();
return replaceableCharacters;
}
然而,当我这样做时,它抛出了InvalidCastException。但是,如果我将返回类型更改为List<string>
并将reader["Character"]
转换为字符串,则可以正常工作。有谁知道为什么会这样?
答案 0 :(得分:3)
请阅读http://www.sqlite.org/datatype3.html。
Sqlite有五种类型的亲和力(类型首选由一列表)和五个存储类(可能的实际值类型)。其中任何一个都没有CHARACTER
类型。
Sqlite允许您指定任何作为列创建的类型。但它不会为除INTEGER PRIMARY KEY
列之外的所有内容强制执行类型。它识别声明类型名称的一些 substring 以确定列类型亲缘关系,因此CHARACTER
,CHARCOAL
和CONTEXTUALIZABLE
都只是一种有趣的写作方式{{ 1}}。