SQL查询执行难度

SQL query execution difficulty

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

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

它会产生以下错误:

Invalid column name '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'+' " '

但是没感觉...

也许您会更喜欢这样的内容:

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

如果要在字符串中添加单个字符:

SELECT '''hello'''

首先,您生成的查询无效,因为双引号用于数据库对象名称,而不用于字符串文字:"divyesh" 是列名,'divyesh' 是字符串。您需要第二个,因此将双引号更改为单引号。

其次,永远不要使用用户输入来构建这样的 SQL 语句。如果您的用户选择了一个名称 "'; DROP DATABASE yourdb; SELECT '",您的数据库就会消失。阅读有关 'SQL injection'.

主题的更多信息

真的,您正在向您的 dbms 发送此查询

SELECT ID FROM Student WHERE Name ='' divyesh '' 

您的 dbms 正确解释了 sql 到

SELECT ID FROM Student WHERE Name ='' 

然后它找到

divyesh ''

它首先尝试知道 divyesh 它是否是 Student table 的一列,因为它不会引发错误,您在应用程序中看到异常..

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

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

通常,在编写动态查询代码时,您的案例会被阻止,将 "str" 过滤器参数提交给一些辅助方法,检查是否存在一些单引号并最终将它们加倍。

这是一个(C#,或 Java)关于以下内容的简单解决方案:

"SELECT ID FROM Student WHERE Name ='" + str.Replace("'", "''") + "' "


但是我发现在数据库中很难将 "Name" 字段存储在单引号之间,所以我想知道你想做什么..

无论如何你在做什么,在过滤器字段中使用单引号,它也是 sql-注入攻击的一个元素..

你应该绝对避免那种动态查询,并在你的代码中使用一些 api 基于带有参数的 sql 查询语句的对象模型,然后传递给对象"contains" 您查询输入过滤器,实例化参数对象。



在采购订单中澄清后更新

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 指的是您的数据库字段 "Name" 的数据类型(我认为是 varchar),因此它的类型和长度应该相等(对于"name" 字段应该很好 50 个字符),无论如何,参数输入过滤器的长度越低越好

同意之前的回答。在这种情况下,您必须使用 Prepared Statements。 在 this 页面中,您可以找到示例