Search code examples
c++mysqlparameterized-query

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


I cannot seem to find any resolution to this issue on my own. I use this generic function to retrieve data from a database like so: int id = 29 ArrayList^ classes = getClassesGeneric("dep_id", "=", id.ToString());

However, this returns no results. If I query the database through MySQL Workbench or without parameters it works fine. What am I missing?

    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;
    }

Using the function like this produces the indented result: classes = getClassesGeneric("1", "=", "1");


Solution

  • Parameters can only be used to replace literals, not object names or syntactic elements, such as the = operator. You'd either have to hardcode it. If you want to pass them dynamically, you'd have to use string manipulation:

    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();