我在从应用程序添加学生时进行验证。如果我运行以下查询
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+' "
答案 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页面中,您可以找到示例