C#无效列名问题但与其他不同

Posted

技术标签:

【中文标题】C#无效列名问题但与其他不同【英文标题】:C# invalid column name problem but is different from others 【发布时间】:2021-12-10 07:14:35 【问题描述】:

您好,我有一个名为 Card_tbl 的表,其中包含一个单元 CardID。问题是当我只插入像 12345 这样的数字时,它们会上传到数据库中,但是当我使用像 Q1234R 这样的混合字母时,它会说 INVALID COLUMN NAME Q1234R 我尝试了很多东西修复它但没有成功。 单元格在 VARCHAR(50) 上这是我的代码

Con.Open();
            SqlCommand cmd = new SqlCommand("insert into Card_tbl values(" +txtCardNumber.Text+")", Con);
            cmd.ExecuteNonQuery();
            MessageBox.Show("Admin Successfully Added!");
            Con.Close();
            populate();
            //updateroomstate();
            Clean();

此处显示错误cmd.ExecuteNonQuery();

提前谢谢你。

【问题讨论】:

使用sql参数传递值。这可以防止很多问题,例如您拥有的问题和 sql 注入 无论如何,我建议查看“准备好的语句”,也就是“参数化查询”,因为这应该 1) 解决您的问题并 2) 保护您免受 SQL 注入攻击。 @Llama 事情是相同的查询适用于我声明 varchar(50) 并且字符和数字都插入数据库中的其他表没有问题。 您还应该在Concmd 上有using 块,并且不要在连接打开时用MessageBox 阻塞线程 【参考方案1】:

解决方案

正确的解决方案是使用准备好的语句。你说过这个专栏是varchar(50) 所以:

using (SqlConnection conn = new SqlConnection("yourconnectionstring"))

    conn.Open();
    using (SqlCommand cmd = new SqlCommand("INSERT INTO Card_tbl VALUES (@cardNumber)", conn))
    
        // we specify type VarChar and size 50, because your column is a varchar(50)
        cmd.Parameters.Add("@cardNumber", SqlDbType.VarChar, 50).Value = txtCardNumber.Text;
        cmd.ExecuteNonQuery();
    

我还建议您指定插入的列名:

INSERT INTO Card_tbl (CardId) VALUES (@cardNumber) -- I've assumed that the column is called CardId

为什么我们需要参数化查询/准备好的语句?

我们需要预处理语句的原因是因为用户可能在查询中输入恶意内容,从而迫使您的服务器执行您不​​打算执行的查询。

如果您有这样的查询,SQL Server 将执行插入然后删除表:

INSERT INTO MyTable VALUES ('hello'); DROP TABLE MyTable; -- comment

这是一个多语句查询,意味着先执行 INSERT,然后执行 DROP TABLE。 -- 表示注释,查询中之后的所有内容都将被丢弃。

现在,如果您构建一个类似"INSERT INTO MyTable VALUES ('" + someUserInput + "')" 的查询,恶意用户如何使这个查询更像之前的查询?很简单:在他们的输入中输入 SQL。

假设someUserInput'); DROP TABLE MyTable; -- comment,那么您的查询将变为:

INSERT INTO MyTable VALUES(''); DROP TABLE MyTable; -- comment')

像这样,恶意用户可以对您的数据库执行极具破坏性的操作,绕过登录页面,暴露机密信息等。这对您的应用程序来说是一个巨大的风险。

准备好的语句通过将查询文本与参数值分开来工作。因为它们不是查询的一部分,所以它们不能被解释为 SQL。这也意味着二进制数据类型可以作为二进制而不是文本发送到服务器。示例:DateTime

【讨论】:

【参考方案2】:

试试这个

插入 Card_tbl(CardID) values('" +txtCardNumber.Text+"')"

https://www.w3schools.com/sql/sql_insert.asp

【讨论】:

No没有工作仍然说同样的错误.. 您确定要在值周围添加单引号吗?除此之外,正如 Hans 所说,使用 ask Parma 传递到现有存储过程会更安全。 Obligatory XKCD reference。请不要给出这样的坏建议。 SQL 注入问题现在不应该成为问题,但是人们以您在答案中的方式编写查询只会传播问题。 很抱歉回答了 O P 提出的问题。我没有写查询,我只是指出了他的查询失败的原因。与您在上面的 cmets 中所做的非常相似。 您可以通过使用参数正确回答。列名是一个很好的补充,但不足以提供安全的解决方案

以上是关于C#无效列名问题但与其他不同的主要内容,如果未能解决你的问题,请参考以下文章

选择语句:列名无效,在 C# 中使用 Dapper

列名无效是啥意思?

c#从数据库中读取图片出现参数无效

c#从数据库中读取图片出现参数无效

c#中给sql数据库的表储存数据时提示“列名无效”

如何修复 SqlException:列名无效