SQL查询执行难度

时间:2016-06-27 09:09:31

标签: c# sql asp.net sql-server-2008 ado.net

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

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+' "

4 个答案:

答案 0 :(得分:2)

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

但没有意义......

也许你会喜欢这样的东西:

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

如果您想在字符串中添加单个cuotes:

SELECT '''hello'''

答案 1 :(得分:1)

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

其次,永远不要使用用户输入来构造这样的SQL语句。如果您的用户选择名称"'; DROP DATABASE yourdb; SELECT '",您的数据库就会消失。阅读有关“SQL注入”主题的更多信息。

答案 2 :(得分:1)

真的,你是在发送你的dbms这个查询

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

你的dbms正确解释了sql到

SELECT ID FROM Student WHERE Name ='' 

然后找到

divyesh ''

它首先尝试知道 divyesh 是否是Student表的一列,因为它没有引发错误,你在应用程序异常中看到了..

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

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

通常,在编写动态查询时,会阻止您的情况,将“str”过滤器参数提交给某个帮助方法,该方法检查是否存在单个引号并最终将它们加倍。

对于所说的内容,这是一个(C#或Java)简单的解决方案:

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


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

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

你应该完全避免那种动态查询,并在你的代码中使用一些基于带有参数的sql查询语句的对象模型的api,因此传递给“包含”你的查询输入过滤器的对象,实例化参数对象。



在PO 中进行说明后, 更新

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),所以它在tyope和lenght中应该相等(对于“name”字段应该很好50个字符),无论如何,参数输入过滤器的长度越低,它就越好

答案 3 :(得分:1)

我同意之前的回答。在这种情况下,您必须使用准备好的声明。 在this页面中,您可以找到示例