【问题标题】:Insert command string building插入命令字符串构建
【发布时间】:2014-01-02 12:14:15
【问题描述】:

我在以下插入命令字符串中找不到错误。让我知道你是否注意到。构建这种类型的命令字符串的最佳方法是什么。如果整个字符串显示红色〜,则很难找到错误。 我用 pm 选择了每个数据值。手动以避免任何机会或错误。

cmd = new OleDbCommand("insert into ProjectMaster (ProjectCode, TransactionType, Description, Justification, RequesterName, RquesterID) values ('" +
    pm.ProjectCode + "','" + pm.TransactionType + "','" +
    pm.Description + "','" + pm.Justification + "','" +
    pm.RequesterName + "','" + pm.RequesterID  + "')", con);

    cmd.ExecuteNonQuery();

【问题讨论】:

  • 请添加您拥有的错误消息。也google一下SQL注入
  • 你有什么迹象表明甚至有错误?至于如何构建查询的一般建议,我想到了两件事:1)不要使用字符串连接,使用参数化查询; 2) 偶尔使用回车让你的代码更易读。
  • 当你把括号放在正确的位置时,RquesterID 可能是你的下一个问题。如果考虑标准化,你也会好很多。例如,如果您确实有一个 Requester 表,那么使用连接插入而不是将所有数据吸入客户端会有很大帮助。

标签: c#


【解决方案1】:

构建这种类型的命令字符串的最佳方法是什么。

您使用参数化 SQL。 像这样将要使用的值连接到 SQL 中。它使您面临 SQL 注入攻击、转换错误和通常混乱的代码。

您使用的代码如下:

// Obviously fill in the "..." with the rest of the fields you need to use
string sql = "INSERT INTO ProjectMaster (ProjectCode, TransactionType, ...) "
           + "VALUES (@ProjectCode, @TransactionType, ...)";
using (var connection = new SqlConnection(...))
{
    connection.Open();
    using (var command = new SqlCommand(sql, connection))
    {
        // Check the parameter types! We don't know what they're meant to be
        command.Parameters.Add("@ProjectCode", SqlType.NVarChar).Value = ...;
        command.Parameters.Add("@TransactionType", SqlType.NVarChar).Value = ...;
        ...
        command.ExecuteNonQuery();
    }
}

另外,请考虑使用 ORM 而不是原始 SQL。

【讨论】:

  • 有人说原始 SQL 性能比 ORM 好,这是真的吗?
  • @Selman22:有时。有时不是。您需要检查性能并可能在这两种情况下对其进行调整,我怀疑对于 大多数 应用程序,调整后的差异可以忽略不计。 (情况并非总是如此,但我会开始使用 ORM,然后仅针对您需要它的情况转移到原始 SQL...)
  • 而且许多 ORM 会自动映射额外的列和属性,从而更容易保持代码和 DB 同步。特别是对于如此冗长的 INSERT 语句。
  • 我必须使用 @ 将其分配给一个字符串,并且所有内容都必须放在一行中,否则 "VALUES (@ProjectCode, @TransactionType, ...)" 会出错。
  • @user2026794:完全不清楚你的意思(特别是“它给出错误”给我们的信息很少),但你绝对不需要把它放在一条线上。您可以对 SQL 本身使用字符串连接(例如,将其放在多行上) - 但 不要 将值包含在 SQL 中。
【解决方案2】:

我认为你的错误可能在这里

pm.ResourceCount + "','" + pm.IssueFlag) + "')"

应该是

pm.ResourceCount + "','" + pm.IssueFlag + "')")

基本上,看起来您在添加结束括号之前关闭了命令字符串。不过,正如其他人所建议的那样,使用参数化 SQL 或其他数据访问技术,而不是庞大的 SQL 字符串。

【讨论】:

  • 我刚刚将所有华夫饼粘贴到 C# 中,它把红色的波浪线放在那里,所以我认为你是对的。
【解决方案3】:

如果您遇到必须编写在运行时构建字段列表的“通用代码”的情况。您仍然不应该按照您的方式编写代码(由于 SQL 注入等原因)。

这个previous answer有一些有用的建议,Linq版本其实很简单有用

【讨论】:

  • 你能举个例子说明如何使用Linq在数据库中插入记录
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2018-11-25
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多