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