【问题标题】:Portable Class Library for SQLite - no type validation?SQLite 的便携式类库 - 没有类型验证?
【发布时间】:2014-08-12 08:32:34
【问题描述】:

我正在为我的 PCL 中的通用应用程序项目使用新的 SQLite 可移植类库 (PCL)。

我可以将字符串放入整数,也可以将字符串放入大小有限的字段。将插入所有值而不会出现警告或错误。

此外,我可以创建没有传递数据类型的表,或者我可以将任何内容设置为数据类型。这让我认为所有字段都将是相同的数据类型(可能是一个可以放入任何内容的文本)。这方面似乎会影响性能。我是否配置了其他东西?

例如:

using (var c = new SQLiteConnection(_dbName))
        {
            using (var statement = c.Prepare(@"CREATE TABLE IF NOT EXISTS Test (
                                                                    Id INTEGER NOT NULL PRIMARY KEY,
                                                                    MyString LALALA NOT NULL,
                                                                    MyInt INTEGER NOT NULL);"))
            {
                statement.Step();
            }
        }

using (var statement = c.Prepare(@"INSERT INTO Test (MyString, MyInt)
                                        VALUES(@myString, @myInt);"))
            {
                statement.Bind("@myString", "hello tablehello tablehello tablehello tablehello tablehello tablehello table");
                statement.Bind("@myInt", "9asd");

                // Inserts data.
                statement.Step();

                // Resets the statement, to that it can be used again (with different parameters).
                statement.Reset();
                statement.ClearBindings();

                statement.Bind("@myString", "hello world");
                statement.Bind("@myInt", "asdasd");

                // Inserts data.
                statement.Step();
            }

而且一切正常 - 为什么?

另外,是否可以以只读方式打开连接? 在其他 sqlite 库中这是可能的。

再见 马库斯

【问题讨论】:

    标签: c# sqlite win-universal-app portable-class-library


    【解决方案1】:

    请参阅“清单输入”下的 http://www.sqlite.org/different.html

    大多数 SQL 数据库引擎使用静态类型。关联的数据类型 表中的每一列,只有该特定的值 允许将数据类型存储在该列中。 SQLite 放松了这一点 通过使用清单类型进行限制。在清单类型中,数据类型 是值本身的属性,而不是所在列的属性 值被存储。因此,SQLite 允许用户存储任何值 任何列的数据类型,无论该列的声明类型如何 柱子。 (此规则有一些例外情况:INTEGER PRIMARY KEY 列只能存储整数。并且 SQLite 试图强制 尽可能将值添加到列的声明数据类型中。)

    到目前为止 正如我们所知,SQL 语言规范允许使用 清单打字。然而,大多数其他 SQL 数据库引擎是 静态类型等等有人觉得使用manifest 打字是 SQLite 中的一个错误。但是SQLite的作者们觉得很 强烈认为这是一个功能。在 SQLite 中使用清单类型 是经过深思熟虑的设计决策,实践证明 SQLite 更可靠且更易于使用,尤其是在使用 与动态类型的编程语言(如 Tcl)相结合 和 Python。

    现在我不一定相信这是一件好事(我从来没有,曾经相信更松散的打字会使任何东西“更可靠”),但这确实是 SQLite 的行为方式。基本上它几乎总是忽略列类型,因此您需要担心是否将正确的值放入其中。

    【讨论】:

    • 哦,谢谢你的解释,我同意你的看法......你知道为什么我不能在这个 pcl 版本中打开只读连接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多