我正在尝试在Sqlite数据库上实现一个数据访问层。我的一个表包含一个datetime字段。
我在将数据插入到这个datetime字段时遇到了问题。
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);我的桌子创作:
cmd.CommandText = "CREATE TABLE IF NOT EXISTS Orders(" +
"OrderId TEXT PRIMARY KEY NOT NULL, " +
"Status TEXT, " +
"CreationTime DATETIME, " +
"LastModification DATETIME, " +
"CreatorName TEXT)";发布于 2013-10-10 13:25:20
不要手工创建字符串,而是使用参数化查询并添加参数值。正如您所发现的那样,使用String.Format肯定会导致转换错误,并使您暴露于SQL注入攻击。
当您使用参数时,这些值是在没有任何转换的情况下传递的,因此您不必担心转换错误或注入攻击。大多数数据库还能够更好地优化查询,因为它们知道哪些部分可以更改,哪些部分在执行过程中保持不变。
在你的例子中,你可以使用这样的东西:
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);取消主题的-为什么参数化查询速度更快
所有服务器都必须解析查询才能理解其结构,并创建运行查询的执行计划。该计划包含要使用的索引、筛选或连接策略、可能需要的临时结构等。创建此计划成本高昂,因此大多数服务器缓存它们创建的计划以供以后使用。
除非服务器知道查询中的哪些值实际上是参数,哪些值是手工编码的,否则如果不实际解析查询,服务器就无法决定是否可以使用现有计划或创建新的计划。通过自己指定参数,您可以让服务器创建更好和更可重用的计划。如果您每秒钟执行大量查询,这将是一个很大的提升。
更不用说,以其本机形式传递值比以文本形式传递值要轻得多,因此速度更快。
https://stackoverflow.com/questions/19296760
复制相似问题