Sql server 使用撇号和通配符从C++;到SQL

Sql server 使用撇号和通配符从C++;到SQL,sql-server,devart,borland-c++,Sql Server,Devart,Borland C++,下午好 我一直在为一个应用程序开发一个dll扩展,它是一个关于客户活动的报告,第一部分是查找客户的用户搜索 查询本身工作正常,但当我试图通过参数传递使其成为SQL注入证明时,我无法使其工作 我尝试在主查询中使用撇号和通配符,但当我使用q->Params->ParamByName(“ID”)->AsString=param时,函数抛出了一个异常,表示它找不到我确认的参数,该参数是撇号的效果。当我将撇号和通配符作为如下参数的一部分传入时,没有错误,但查询不返回任何结果 我尝试过避开撇号和通配符,但没

下午好

我一直在为一个应用程序开发一个dll扩展,它是一个关于客户活动的报告,第一部分是查找客户的用户搜索

查询本身工作正常,但当我试图通过参数传递使其成为SQL注入证明时,我无法使其工作

我尝试在主查询中使用撇号和通配符,但当我使用q->Params->ParamByName(“ID”)->AsString=param时,函数抛出了一个异常,表示它找不到我确认的参数,该参数是撇号的效果。当我将撇号和通配符作为如下参数的一部分传入时,没有错误,但查询不返回任何结果

我尝试过避开撇号和通配符,但没有任何区别

请让我知道,如果我需要提供任何更多的信息

TStringList* SQLString = new TStringList;
SQLString->Add("select p.id, p.givenName, p.surname, p.dateOfBirth, vm.MaxRowDate ");
SQLString->Add("from (  ");
SQLString->Add("    select pid, customer_systemID, customer_dbID, max(datetime) as MaxRowDate ");
SQLString->Add("    from Visit ");
SQLString->Add("    group by pid, customer_systemID, customer_dbID");
SQLString->Add("     ) vm ");
SQLString->Add("inner join Customer p ");
SQLString->Add("ON vm.pid = p.pid ");
SQLString->Add("and vm.customer_systemID = p.systemID ");
SQLString->Add("and vm.customer_dbID = p.databaseID ");

AnsiString joiningTerm("where ");

 if(id != "")
{
    SQLString->Add(joiningTerm+"id like :ID ");
    joiningTerm = "and ";
}

SQLString->Add("order by surname ");

TMSQuery* q;

try
{

    try
    {
        q = new TMSQuery(NULL);
        q->Connection = _db;


        q->SQL->Assign(SQLString);

        if(id != "")
        {
            AnsiString param("'%"+id+"%'");
            q->Params->ParamByName("ID")->AsString = param;
        }

        q->Open();
以下是我的原始SQL查询:

SELECT p.id, p.givenName, p.surname, p.dateOfBirth, vm.MaxRowDate
FROM
( 
    SELECT pid, customer_systemID, customer_dbID, MAX(DATETIME) AS MaxRowDate
    FROM Visit
    GROUP BY pid, customer_systemID, customer_dbID
) vm
INNER JOIN Customer p
ON vm.pid = p.pid AND vm.customer_systemID = p.systemID AND vm.customer_dbID = p.databaseID

编辑:有人向我建议,也许这是图书馆的局限性。我将在Devart论坛上发帖,如果我得到回复,我会回复

这里的一个选项是验证用户输入。遍历输入并删除所有无效字符,或返回错误并删除整个输入/事务。

尝试此<代码>解析参数(“%”+id+“%”)我知道这不是您的问题,但由于它是相关的,您确定需要完全动态地创建查询吗?也许这还不是完整的用例,但似乎这个逻辑足够简单,可以封装在存储过程中,这样你就不用担心注入问题了。@M.Ali我试过了,但仍然没有luck@Xedni动态查询是为了便于移植,此dll将安装在多个站点上,每个站点都有自己的数据库(其中一些我不容易访问),我希望能够在不修改数据库的情况下部署dll。我认为SQL Server需要
@
作为参数标记。您是如何连接到数据库服务器的?谢谢您的回答,但问题不是用户输入无效字符,而是查询需要使用通配符进行搜索,值需要用撇号括起来。