SQL参数-在哪里进行扩展
我对在SQL查询中使用参数感到有点困惑,看到了一些我无法立即解释的事情,所以我现在只想了解一些背景信息 首先,查询中的参数名是否有标准格式,或者该数据库/中间件是否依赖?这两个我都见过:-SQL参数-在哪里进行扩展,sql,odbc,sqlparameter,Sql,Odbc,Sqlparameter,我对在SQL查询中使用参数感到有点困惑,看到了一些我无法立即解释的事情,所以我现在只想了解一些背景信息 首先,查询中的参数名是否有标准格式,或者该数据库/中间件是否依赖?这两个我都见过:- DELETE * FROM @tablename 而且 DELETE * FROM :tablename 第二,参数替换(通常)发生在哪里?在将查询发送到数据库之前是否替换/扩展参数,或者数据库是否单独接收参数和查询,并自行执行扩展 作为背景,我正在使用C++Builder应用程序中的DevArt
DELETE * FROM @tablename
而且
DELETE * FROM :tablename
第二,参数替换(通常)发生在哪里?在将查询发送到数据库之前是否替换/扩展参数,或者数据库是否单独接收参数和查询,并自行执行扩展
作为背景,我正在使用C++Builder应用程序中的DevArt UniDAC工具包通过ODBC连接到Excel电子表格。我知道这在一些方面几乎是悲观的。。。(我试图理解为什么一个特定的命令只有在不使用参数时才能工作)SQL参数被发送到数据库。数据库本身执行扩展。这允许数据库设置一个查询计划,该计划将用于不同的参数值 Microsoft始终使用
@parname
作为参数。Oracle使用:parname
。其他数据库则不同
据我所知,没有数据库允许您将表名指定为参数。您必须扩展该客户端,如:
command.CommandText = string.Format("DELETE FROM {0}", tableName);
p.S.
*
在删除后不允许使用*
。毕竟,您只能删除整行,不能删除一组列。SQL参数被发送到数据库。数据库本身执行扩展。这允许数据库设置一个查询计划,该计划将用于不同的参数值
Microsoft始终使用@parname
作为参数。Oracle使用:parname
。其他数据库则不同
据我所知,没有数据库允许您将表名指定为参数。您必须扩展该客户端,如:
command.CommandText = string.Format("DELETE FROM {0}", tableName);
p.S.*
在删除后不允许使用*
。毕竟,您只能删除整行,不能删除一组列。对于此类数据访问库,如UniDAC
或FireDAC
,您可以使用宏。它们允许您在不允许使用参数的SQL命令位置使用特殊标记(称为宏)。我不知道UniDAC API,但将为FireDAC提供一个示例:
ADQuery1.SQL.Text := 'DELETE * FROM &tablename';
ADQuery1.MacroByName('tablename').AsRaw := 'MyTab';
ADQuery1.ExecSQL;
使用此类数据访问库,如UniDAC
或FireDAC
,可以使用宏。它们允许您在不允许使用参数的SQL命令位置使用特殊标记(称为宏)。我不知道UniDAC API,但将为FireDAC提供一个示例:
ADQuery1.SQL.Text := 'DELETE * FROM &tablename';
ADQuery1.MacroByName('tablename').AsRaw := 'MyTab';
ADQuery1.ExecSQL;
第二,参数替换(通常)发生在哪里
没有。这就是重点。查询中的数据元素保留数据项。代码元素保持代码元素。两者从不相交,因此恶意数据永远不会被视为代码
通过ODBC连接到Excel电子表格。。。我试图理解为什么一个特定的命令只有在不使用参数的情况下才能工作
Excel并不是一个真正的数据库引擎,但如果它是,您仍然不能使用参数作为表的名称
第二,参数替换(通常)发生在哪里
没有。这就是重点。查询中的数据元素保留数据项。代码元素保持代码元素。两者从不相交,因此恶意数据永远不会被视为代码
通过ODBC连接到Excel电子表格。。。我试图理解为什么一个特定的命令只有在不使用参数的情况下才能工作
Excel并不是一个真正的数据库引擎,但如果它是,您仍然不能使用参数作为表的名称。谢谢。DELETE*
似乎确实有效,但我知道这不是必需的。我认为params的主要优点是避免SQL注入——所以表名不受支持似乎很奇怪?参数是为了性能而创建的。它们允许数据库准备使用不同参数值的相同查询。如果它们是针对注入而设计的,那么它们将允许表名、orderby
之后的列等等。性能是一个很好的副作用。参数是为了安全而创建的,以绝对不受侵犯的方式防止sql注入攻击。@JoelCoehoorn-例如,为什么不能在表名中使用它们呢?当然,这有点遗漏?我发现大多数关于参数/准备好的语句的参考文献都将性能和保护列为主要优势,但并不意味着两者都有副作用。谢谢。DELETE*
似乎确实有效,但我知道这不是必需的。我认为params的主要优点是避免SQL注入——所以表名不受支持似乎很奇怪?参数是为了性能而创建的。它们允许数据库准备使用不同参数值的相同查询。如果它们是针对注入而设计的,那么它们将允许表名、orderby
之后的列等等。性能是一个很好的副作用。参数是为了安全而创建的,以绝对不受侵犯的方式防止sql注入攻击。@JoelCoehoorn-例如,为什么不能在表名中使用它们呢?当然这有点遗漏?我发现的大多数关于参数/预处理语句的引用都将性能和保护列为主要优势,但并不意味着两者都有副作用。糟糕的示例:通常不能将参数用作表本身的名称。@JoelCoehoorn-如果我使用“更好”的示例,没有人会告诉我我真正的问题是什么!糟糕的例子:通常不能使用参数作为表本身的名称。@JoelCoehoorn-如果我使用“更好”的例子,没有人会告诉我我的实际问题是什么!谢谢-我刚找到UniDAC宏。他们被解雇了