使用c++ . net MySQL连接器的参数化查询不返回结果

Parameterized Query Returns no Results using C++ .Net MySQL Connector

本文关键字:查询 返回 结果 参数 c++ net MySQL 连接器 使用      更新时间:2023-10-16

我自己似乎找不到解决这个问题的办法。我使用这个通用函数从数据库中检索数据,如下所示: int id = 29 ArrayList^ classes = getClassesGeneric("dep_id", "=", id.ToString());

但是,这不会返回任何结果。如果我通过MySQL工作台或没有参数查询数据库,它工作得很好。我错过了什么?

    ArrayList^ Accessor::getClassesGeneric(String^ col, String^ op, String^ value)
    {
            ArrayList^ result = gcnew ArrayList();
            this->cmd = gcnew MySqlCommand("SELECT * FROM rpos_db.classes WHERE @col @op @value;", this->con);
            try
            {
                this->cmd->Parameters->AddWithValue("@col", col);
                this->cmd->Parameters->AddWithValue("@op", op);
                this->cmd->Parameters->AddWithValue("@value", value);
                this->cmd->Prepare();
                MySqlDataReader^ r = this->cmd->ExecuteReader();
                while (r->Read())
                {
                    Class^ c = gcnew Class();
                    c->id = r->GetInt32(0);
                    c->dep_id = r->GetInt32(1);
                    c->name = r->GetString(2);
                    c->code = r->GetString(3);
                    result->Add(c);
                }
                r->Close();
            }
            catch (Exception^ ex)
            {
                MessageBox::Show(ex->StackTrace, ex->Message);
            }
            return result;
    }

像这样使用函数会产生缩进的结果:classes = getClassesGeneric("1", "=", "1");

参数只能用于替换文字,而不能用于替换对象名称或语法元素,例如=操作符。你要么硬编码它。如果你想动态传递它们,你必须使用字符串操作:

ArrayList^ Accessor::getClassesGeneric(String^ col, String^ op, String^ value)
{
        ArrayList^ result = gcnew ArrayList();
        this->cmd = gcnew MySqlCommand
                    ("SELECT * FROM rpos_db.classes WHERE " + 
                     col + " " + op + " @value;", this->con);
        try
        {
            this->cmd->Parameters->AddWithValue("@value", value);
            this->cmd->Prepare();
            MySqlDataReader^ r = this->cmd->ExecuteReader();