Sqlcommand AND似乎忽略了第一个参数

时间:2019-02-04 14:38:50

标签: sql-server winforms visual-c++

当我在sqlcommand代码中使用AND时,它仅跟随最后一位

        SqlCommand^ FinArstiCmd = gcnew SqlCommand("SELECT * FROM ARSTI1 WHERE SLIMID=' 
        @SlimuID ' AND UNIQJOBID=' @JobID ';", con);

        FinArstiCmd->Parameters->Add("@SlimuID", SqlDbType::VarChar);
        FinArstiCmd->Parameters->Add("@JobID", SqlDbType::VarChar);
        FinArstiCmd->Parameters["@SlimuID"]->Value = SlimId1;
        FinArstiCmd->Parameters["@JobID"]->Value = JobID1;


        SqlDataReader^ FinArstRead;

        try {
            con->Open();

            String^ ArstaVards;
            FinArstRead = FinArstiCmd->ExecuteReader();

            while (FinArstRead->Read()){
                ArstaVards = FinArstRead["FULL_NAME"]->ToString();
                listBox1->Items->Add(ArstaVards);

            }
            con->Close();
        }
        catch (Exception^ ex) {
            MessageBox::Show(ex->Message);
        }

当我使用上面的代码时,它将输出数据库中只有正确的@jobid的每一行,而不输出两个参数都正确的

1 个答案:

答案 0 :(得分:0)

坦率地说,我不太确定为什么看到的行全部返回(除了您的条目中SLIMID的字面值为@SlimuID,而UNIQJOBID的值为@JobID)。这真的是您使用的代码还是一些模拟的示例?

无论如何,不​​要将参数放在引号中:

    SqlCommand^ FinArstiCmd = gcnew SqlCommand("SELECT * FROM ARSTI1 WHERE SLIMID=' 
    @SlimuID ' AND UNIQJOBID=' @JobID ';", con);

通过这种方式,SQL解析器认为您正在寻找列@SlimuID的实际值SLIMID

正确:

    SqlCommand^ FinArstiCmd = gcnew SqlCommand("SELECT * FROM ARSTI1 WHERE SLIMID= 
    @SlimuID AND UNIQJOBID=@JobID;", con);

关于参数化查询的另一个好处是,正确的报价-如果需要,请考虑INT值,将由数据库引擎处理。