ODBC 库通常提供创建参数化查询的功能,这些查询将查询和参数分别传递给数据库。这基本上消除了 SQL 注入攻击的风险,但从编程的角度来看也非常方便。由于 JMP 具有 ODBC 查询,因此它也应该具有参数化查询,以便您可以执行以下操作:
Execute SQL(database,
"Select * from Employees where Name like ? and Status=?",
"BobList",
{"Bob", "Active"}
);pyodbc的参数化查询:
https://github.com/mkleehammer/pyodbc/wiki/Getting-started#parameters
.NET生态系统的参数化查询:
https://docs.microsoft.com/en-us/dotnet/api/system.data.odbc.odbccommand.parameters?redirectedfrom=MSDN&view=dotnet-plat-ext-5.0#System_Data_Odbc_OdbcCommand_Parameters
我认为您可以使用命名查询来实现这一点:创建命名查询() 和执行命名查询()。在底层,这些函数将使用 ODBC SQLPrepare()、SQLBindParameter() 和 SQLExecute() 函数。创建命名查询() 函数将采用 SQL 语句和参数。它将返回一个命名查询对象。执行命名查询() 将采用数据库连接对象、命名查询对象和参数值作为输入,并将 SQL 结果作为数据表返回(如果需要)。数据库连接对象可以是创建函数的输入,而不是执行函数的输入。这种方法的好处是,创建可以在脚本初始化时进行,而将执行部分分开,这可能会更有效率。
我也希望能有类似的东西,至少能够分别传递 SQL 连接和查询参数,以便更轻松地进行单元测试。例如,在测试包含 SQL 查询的函数时,可以轻松地将连接替换为本地 JMP 表。