SQL查询执行难度

3

我正在应用程序中添加学生时进行验证。如果我运行以下查询:

SELECT ID FROM Student WHERE Name =' " '+str+' " '

这会生成以下错误:

无效的列名'str'。

我的应用程序将生成DBException。

我该如何解决这个问题?

编辑

String SName=txtBox1.Text;

String sql="select id from student where name = ' "+SName.Trim()+" ' ";

SqlConnection connection = null;
SqlDataReader reader = null;
try
{
    connection = GetConnection();
    SqlCommand command = new SqlCommand(sql, connection);
    if (_sqltransection != null)
    {
        command.Transaction = _sqltransection;
    }
    reader = command.ExecuteReader(CommandBehavior.CloseConnection);
}            
catch (SqlException ex)
{
    throw new DBException(ex);
}

txtBox.Text=" '+str+' " 代码中


你需要添加更多的单引号来将其转换为字符串,否则它将被解析为 SELECT ID FROM Student WHERE Name =divyesh - Pரதீப்
你的代码看起来容易受到 SQL 注入攻击。 - Pரதீப்
divyesh是什么?它是一个列名,一个变量/参数还是一个(失败的)字符串字面值? - jarlh
divyesh只是一个字符串。 - Divyesh
非常感谢,它起作用了。 - Divyesh
显示剩余4条评论
4个回答

2
SELECT ID FROM Student WHERE Name =' " '+'divyesh'+' " '

但是没有任何意义...

也许你更喜欢这样的内容:

SELECT ID FROM Student WHERE Name like '%divyesh%'

如果您想在字符串中添加单引号:
SELECT '''hello'''

但是我该如何修改用户输入? - Divyesh
"SELECT ID FROM Student WHERE Name = '" + txtStudentName.Text.Trim() + "'" 请将此代码翻译为中文: - SharK
我知道这没有意义,但在我的应用程序中,如果用户输入像“' +str+ '”这样的字符串,那我该怎么办? - Divyesh
为了更清晰明确,"SELECT ID FROM Student WHERE Name = ' " + txtStudentName.Text.Trim() + " ' " - SharK
"SELECT ID FROM Student WHERE Name = ' " + txtStudentName.Text.Trim() + " ' 不起作用。生成相同的错误。" - Divyesh

1
首先,你的查询结果是无效的,因为双引号用于数据库对象名称,而不是字符串文字:"divyesh" 是列名,'divyesh' 是字符串。你需要使用第二个选项,因此将双引号更改为单引号。
其次,永远不要使用用户输入来构建类似于SQL语句的语句。如果用户选择一个名字 "'; DROP DATABASE yourdb; SELECT '",你的数据库就会消失。请阅读有关“SQL注入”的更多信息。

绝对正确,SQL注入 - SharK

1

我同意之前的回答。在这种情况下,你必须使用预处理语句。 在this页面中,你可以找到示例。


@Andrew_Bogdanov 欢迎来到 Stack Overflow。我想指出,“之前”的答案可能会被删除或被选为采纳的答案,从而浮现到上面。如果您想引用特定的答案,请使用 @ 符号加上作者的名字。一旦您获得足够的声望,您可以留下评论以改进特定的答案。此外,仅回答一个链接并不是一个好的做法,因为链接可能会失效。干杯! - Ruslan Bes
@RuslanBes 谢谢你的留言。关于 @ 符号,这对我来说是非常有用的信息。如果我的回答中的链接失效了,任何读者都可以使用谷歌搜索“Prepared Statement”这些词,他就能找到所有的信息。 - Andrew Bogdanov

1
真的,你正在向你的dbms发送这个查询。
SELECT ID FROM Student WHERE Name ='' divyesh '' 

您的数据库管理系统正确解释了SQL,直到


SELECT ID FROM Student WHERE Name ='' 

然后它找到了


divyesh ''

它首先尝试确定divyesh是否是学生表的列,如果不是,则会引发应用程序异常中看到的错误。

为了纠正此错误,您应该在动态查询中双引号引用传递的字符串作为过滤器:

SELECT ID FROM Student WHERE Name =' "''+str+''" '

通常,在编写动态查询时,您的情况会被预防,通过将“str”过滤器参数提交给某些辅助方法来检查是否存在单引号,并最终将其加倍。
这是一个(C#或Java)微不足道的解决方案,与所说的相比。
"SELECT ID FROM Student WHERE Name ='" + str.Replace("'", "''") + "' "

我发现在数据库中,“名称”字段被存储在单引号之间非常困难,因此我想知道您在做什么。无论您在做什么,使用单引号过滤字段也是 SQL 注入攻击的一个元素。您应该绝对避免这种动态查询,并在代码中使用基于 SQL 查询语句对象模型的一些 API,通过实例化参数对象将输入过滤器传递给“包含”查询的对象。
String SName = null;

if(!string.IsNullOrEmpty(txtBox1.Text))    
     SName = txtBox1.Text.trim();


String sql="select id from student where name = @paramName";

SqlConnection connection = null;
SqlDataReader reader = null;
try
{
    connection = GetConnection();
    SqlCommand command = new SqlCommand(sql, connection);

    SqlParameter param = new SqlParameter("@paramName", SqlDbType.NVarChar, 50);
    param.Value = SName ?? SqlString.Null;
    command .Parameters.Add(param);

    if (_sqltransection != null)
    {
        command.Transaction = _sqltransection;
    }
    reader = command.ExecuteReader(CommandBehavior.CloseConnection);
}            
catch (SqlException ex)
{
    throw new DBException(ex);
}

请注意,SqlDbType.NVarChar, 50指的是您的数据库字段“名称”(我假设为varchar)的数据类型,因此它应该在类型和长度上相等(对于“名称”字段应该为50个字符),不管怎样,参数输入过滤器的长度越短,效果越好。

在我的应用程序中,如果用户在文本框中输入像“' + str +'”这样的字符串,那我该怎么办? - Divyesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接