SQLite的可移植类库 - 没有类型验证?

时间:2014-08-12 08:32:35

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

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

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

我可以创建没有传递数据类型的表,或者我可以将任何内容设置为数据类型。这让我想到所有字段都是相同的数据类型(也许是一个TEXT,你可以放任何东西)。这方面看起来会影响性能。我是否配置了其他内容?

例如:

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();
            }

一切正常 - 为什么?

此外,还可以打开readonly连接吗? 在其他sqlite库中,这是可能的。

再见 马库斯

1 个答案:

答案 0 :(得分:0)

请参阅“Manifest Typing”

下的http://www.sqlite.org/different.html
  

大多数SQL数据库引擎都使用静态类型。数据类型已关联   表中的每一列,只有该特定的值   允许将数据类型存储在该列中。 SQLite放松了这一点   使用清单打字限制。在清单类型中,数据类型   是值本身的属性,而不是其中的列的属性   值存储。因此,SQLite允许用户存储任何值   数据类型进入任何列,无论其声明的类型如何   柱。 (此规则有一些例外:INTEGER PRIMARY   KEY列只能存储整数。而SQLite试图强迫   值可以在列的声明数据类型中使用。)

     到目前为止   我们可以说,SQL语言规范允许使用   清单打字。不过,大多数其他SQL数据库引擎都是   静态打字,所以有些人觉得使用清单   打字是SQLite中的一个错误。但SQLite的作者非常感觉   强烈认为这是一个功能。在SQLite中使用清单键入   是一项经过深思熟虑的设计决定,已经在实践中证明了这一点   SQLite更可靠,更易于使用,尤其是在使用时   与动态类型编程语言(如Tcl)结合使用   和Python。

现在我不一定相信这是一件好事(我从来没有相信过更宽松的打字会让任何事情变得更可靠'),但这确实是SQLite的表现方式。基本上它几乎在所有时间都忽略了列类型,因此您可以担心是否将正确的值放入其中。