【问题标题】:insert into statement in c#在c#中插入语句
【发布时间】:2012-05-16 13:31:41
【问题描述】:

我想创建一个 SQL 语句,它将取自文本框的值插入到该列中的任何值为 NULL 的列中

我正在用 C# 做它,我想知道是否有人可以帮助我... 我写了一个伪代码版本的命令:

string newPhoneNumber = textBox.Text;
SqlCommand cmd = new SqlCommand(
"INSERT INTO table ([Tag ID]) 
 VALUES ('" + newPhoneNumber + "')"; 
 WHERE columnName = NULL" 
cmd.ExecuteNonQuery();

【问题讨论】:

  • 给出的答案是正确的,但出于安全和性能等几个原因,我总是会使用存储过程而不是 SQL。
  • 我不会发布答案,因为其他人接近是正确的,但是将字符串连接到 SQL 语句中很糟糕! 这是数据库泄露的第一大原因。请改用参数化查询。 aspnet101.com/2010/10/…
  • 不应该是“UPDATE table SET [Tag ID] = ...”吗?
  • 你能在 INSERT 语句中使用 WHERE 吗?

标签: c# sql database


【解决方案1】:

使用是NULL而不是等于NULL:

WHERE columnName IS NULL

【讨论】:

  • 完美的答案简单明了。
  • @K'Leg 我不会说完美。将 OP 代码中的 = 更改为 IS 将引发异常。
  • @Curt Care 解释一下?不要误会我的意思Curt你的回答也很棒。
  • @K'Leg SO 的语法高亮显示非常清楚。字符串已在该行结束,WHERE.. 不是字符串对象,它只是代码中的文本。它不会解析。
  • @Curt 很公平,但这永远不会编译,因此它可能只是一个错字。不管怎样,对我来说都无所谓。如果您希望为每个人做所有事情,那是您的特权。我相信当OP表现出一点技巧时,您可以留一点让他们自己弄清楚。
【解决方案2】:

首先,使用 SQL 参数。这将阻止SQL Injection。不敢相信还没有人提到这一点。 5 个答案,到目前为止,我是唯一一个提到这一点的人。

像这样构造你的命令:

SqlCommand cmd = new SqlCommand(
"INSERT INTO table ([Tag ID]) SELECT TOP 1 @newPhoneNumber FROM [table] WHERE columnName IS NULL");
cmd.Parameters.Add("@newPhoneNumber", Sqldbtype.nvarchar).Value = textBox.Text;
cmd.ExecuteNonQuery();

【讨论】:

  • +1 我也很惊讶。它还超越了 SQL 注入,通过将 SQL 与值分离,使代码更具可读性,并通过字符串转换防止数据丢失。
  • 更好的是,不要使用 SQL - 像我在评论中所说的那样使用存储过程。
  • @bukko 以及我们如何在版本控制下获得存储过程?!
  • 您编写脚本。像添加任何文件一样将脚本添加到版本控制系统中。
  • 我被参数化查询的愤怒蒙蔽了双眼,我错过了明显的:Incorrect syntax near the keyword 'WHERE'. 你不能将WHEREINSERT...VALUES 一起使用。
【解决方案3】:

您不能将Insert QueryWhere 子句一起使用

由于您的价值观已经存在,即使您像其他答案所说的那样写ColumnName IS NUll,它也行不通。

你必须使用Update query

"Update tablename set first_field_name = first_value, 
  second_field_name = second_field_value WHERE columnName IS NULL";

此外,NULL 不是一个值。它是一种状态。这意味着(在前端)尚未分配内存。

例如C# 中的字符串 - 如果未分配内存,则它们为空。它们没有 null。

注意/警告与问题相关,与答案无关:

始终注意SQL Injection。使用参数化查询(带有@的查询)。

More on SQL Injection

【讨论】:

  • 纠正 OP 的每一个问题不是我们的责任,这个答案非常令人满意。如果回答者(你能这么说)决定超越那是奖励积分。
  • @K'Leg - 这是有争议的。考虑到他的应用程序中的 SQL 注入可用于植入恶意 JavaScript,可用于对其他人的应用程序提供跨站点请求伪造攻击,因此可以说让 Web 成为一个更安全的地方是我们的全部责任。如果这里的专家不帮助培训新手的基础知识,谁会呢?请注意,我对我的 pont 值表示反对,这不仅仅是因为我是个混蛋(尽管我是),而是因为它很重要。顺便说一句,-1 被撤销。谢谢。
  • @DavidStratton 很高兴你承认自己是个混蛋。我想我的建议是提及它是一个好主意,但它不应该是一个要求。而且我不认为对试图帮助的人投反对票是答案,它只会阻止人们提供帮助。以您的方式将其添加到 cmets 中,或链接到以前专门讨论 sql 注入的帖子。
  • 我很欣赏大卫对这个问题的热情。这是一件大事。也很高兴 -1 被撤销了。
  • 谢谢更新是我忽略的主要问题
【解决方案4】:

使用此查询,IS 为 NULL。

"INSERT INTO table ([Tag ID]) VALUES (@PhoneNumber) WHERE columnName IS NULL"

使用 ParametrizedCommand,您在其他答案中有示例。

【讨论】:

  • @DavidStratton : 你说的完全正确 :) 我现在要纠正它
【解决方案5】:

有两个问题。在 SQL 中,NULL 不等于任何东西,甚至不等于 NULL。即NULL = NULL 是假的。所以第一个问题是WHERE ColumnName = NULL

其次,SQL 语法无效。使用INSERT .. VALUES 时不能指定where 子句,必须使用SELECT .. WHEREIF.. ELSE。例如

INSERT INTO table ([Tag ID])
SELECT  TOP 1 @PhoneNumber
FROM    YourTable 
WHERE   YourColumn IS NULL

IF EXISTS (SELECT 1 FROM YourTable WHERE YourColumn IS NULL)
    BEGIN
        INSERT Table ([tAG id]) VALUES(@PhoneNumber)
    END

在这两个示例中,YourTable 是存在YourColumn 的表。

最后尽可能避免在构建 SQL 语句时使用字符串连接。

string sql = // One of the queries above
cmd.CommandText = sql
cmd.Parameters.Add("@PhoneNumber", SqlDbType.Varchar).Value = textBox.Text;
cmd.ExecuteNonQuery();

【讨论】:

    【解决方案6】:

    使用LINQ to SQL,自动使用参数,消除SQL注入的危险。

    它也比连接 SQL 语句更容易使用。

    Will using LINQ to SQL help prevent SQL injection

    How to: Insert Rows Into the Database (LINQ to SQL)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多