首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DatetimeOffset与Sqlite

DatetimeOffset与Sqlite
EN

Stack Overflow用户
提问于 2013-10-10 13:13:14
回答 1查看 2.2K关注 0票数 1

我正在尝试在Sqlite数据库上实现一个数据访问层。我的一个表包含一个datetime字段。

我在将数据插入到这个datetime字段时遇到了问题。

代码语言:javascript
复制
cmd.CommandText = string.Format(
                        "INSERT INTO Orders(" +
                            "OrderId, " +
                            "Status, " +
                            "CreationTime, " +
                            "LastModification, " +
                            "CreatorName) " +
                        "VALUES(@orderId,@status,@creation,@modification,@creator)";
                    cmd.Parameters.AddWithValue("@orderId", orderId);
                    cmd.Parameters.AddWithValue("@status", status);
                    cmd.Parameters.AddWithValue("@creation", creationTime);
                    cmd.Parameters.AddWithValue("@modification", lastModificationTime);
                    cmd.Parameters.AddWithValue("@creator", creatorName);

我的桌子创作:

代码语言:javascript
复制
cmd.CommandText = "CREATE TABLE IF NOT EXISTS Orders(" +
                                  "OrderId TEXT PRIMARY KEY NOT NULL, " +
                                  "Status TEXT, " +
                                  "CreationTime DATETIME, " +
                                  "LastModification DATETIME, " +
                                  "CreatorName TEXT)";
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-10 13:25:20

不要手工创建字符串,而是使用参数化查询并添加参数值。正如您所发现的那样,使用String.Format肯定会导致转换错误,并使您暴露于SQL注入攻击。

当您使用参数时,这些值是在没有任何转换的情况下传递的,因此您不必担心转换错误或注入攻击。大多数数据库还能够更好地优化查询,因为它们知道哪些部分可以更改,哪些部分在执行过程中保持不变。

在你的例子中,你可以使用这样的东西:

代码语言:javascript
复制
cmd.CommandText= "INSERT INTO Orders(" +
                        "OrderId, " +
                        "Status, " +
                        "CreationTime, " +
                        "LastModification, " +
                        "CreatorName) " +
                    "VALUES (@orderId,@status,@creation,@modification,@creator)";
cmd.Parameters.AddWithValue("@orderId",orderId);
cmd.Parameters.AddWithValue("@status",status);
cmd.Parameters.AddWithValue("@creation",creation);
cmd.Parameters.AddWithValue("@modification",modification);
cmd.Parameters.AddWithValue("@creator",creator);

取消主题的-为什么参数化查询速度更快

所有服务器都必须解析查询才能理解其结构,并创建运行查询的执行计划。该计划包含要使用的索引、筛选或连接策略、可能需要的临时结构等。创建此计划成本高昂,因此大多数服务器缓存它们创建的计划以供以后使用。

除非服务器知道查询中的哪些值实际上是参数,哪些值是手工编码的,否则如果不实际解析查询,服务器就无法决定是否可以使用现有计划或创建新的计划。通过自己指定参数,您可以让服务器创建更好和更可重用的计划。如果您每秒钟执行大量查询,这将是一个很大的提升。

更不用说,以其本机形式传递值比以文本形式传递值要轻得多,因此速度更快。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19296760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档