将(varchar,nvarchar2,varchar2)与QString进行比较

时间:2012-03-02 22:24:36

标签: c++ oracle qt stored-procedures

将varchar,nvarchar2或varchar2与传递给Oracle数据库的QString变量进行比较时遇到问题。

 CREATE TABLE Korisnici
        (
            id_korisnika varchar(200) PRIMARY KEY,
            ime_korisnika varchar2(200),
            prezime_korisnika varchar2(200),
            broj_telefona varchar2(30),
            adresa_korisnika varchar2(400)
        )
        /

这是我的程序:

//procedure for updating user
    CREATE OR REPLACE PROCEDURE Update_korisnika(
        stari_id IN varchar,
        novo_ime_korisnika IN varchar2,
        novo_prezime_korisnika IN varchar2,
        novi_broj_telefona_korisnika IN varchar2,
        nova_adresa_korisnika IN varchar2)

    IS
    BEGIN
        UPDATE Korisnici 
        SET Korisnici.ime_korisnika=novo_ime_korisnika
            , Korisnici.prezime_korisnika=novo_prezime_korisnika
            , Korisnici.broj_telefona=novi_broj_telefona_korisnika
            , Korisnici.adresa_korisnika=nova_adresa_korisnika 
        WHERE Korisnici.id_korisnika=stari_id;
        COMMIT;
   END;
   /

我调试时发送char的qt代码:

//this is for updateing user
    void MainWindow::promjeni_korisnika(const QString& id, const QString& ime, const QString& prezime, const QString& broj, const QString& adresa)
    {
        //parametri
        init();
        QUrl params;
            params.addQueryItem("action","Update_korisnika");
            params.addQueryItem("id",id);
            params.addQueryItem("ime",ime);
            params.addQueryItem("prezime",prezime);
            params.addQueryItem("broj",broj);
            params.addQueryItem("adresa",adresa);

            QByteArray data;
            data.append(params.toString());
            data.remove(0,1);

            QNetworkRequest request;
            request.setUrl(url);
            request.setHeader(QNetworkRequest::ContentTypeHeader,
            QVariant("application/x-www-form-urlencoded"));

            manager->post(request, data);

            MainWindow::dataList.clear();
            Citanje_korisnika();
    }

所以我只对使用ID的程序有问题,如何使这一切都有效。该ID应该与哪种类型的数据进行比较,以便我可以使用它。

编辑: 这是QML函数,它将数据发送到上面的QT函数:

 funkcije.promjeni_korisnika(text_input5.text,text_input1.text,text_input2.text,text_input3.text,text_input4.text);

然后这部分脚本接受数据:

Update_korisnika($poslani_ar,$id=$_POST['id_korisnika'],$ime=$_POST['ime'],$prezime=$_POST['prezime'],$broj=$_POST['broj'],$adresa=$_POST['adresa']);

然后这部分调用此代码:

function Update_korisnika($poslani_ar,$id,$ime,$prezime,$broj,$adresa)
{
    $imenik = new Imenik($poslani_ar,$id,$ime,$prezime,$broj,$adresa);
    $imenik->Update_korisnika();
}

然后:

function Update_korisnika(){
        $query='BEGIN Update_korisnika(:id_korisnika,:ime_korisnika,:prezime_korisnika,:broj_telefona,:adresa);END;';
        $result=$this->connector->Exec($this->poslani_argument,$query,$this->id_korisnika,$this->ime_korisnika,$this->prezime_korisnika,$this->broj_telefona,$this->adresa);
        //echo $ArrayToXml->toXml($result);
    }

并且最后只有执行所有内容的脚本。我没有放任何构造函数和不必要的东西。这是代码的一部分,例如一起工作。

如何在触发PHP时跟踪它。

2 个答案:

答案 0 :(得分:2)

  

“在id_korisnika开头就是数字,然后我试着改变它   as varchar,nvarchar2,varchar2。但是存在某种问题。一世   不知道如何在存储过程中跟踪它。致电时选择*   来自Korisnici的SQL加上我可以看到3号。“

好的,所以你的实际问题是你在一个字符串数据类型中存储一个数字。它可能在查询中看起来像3,但可能是' 3''3 '' 3 ''3'或任何其他三个和空格的排列。

所以,只需要整理你的数据模型。

答案 1 :(得分:1)

让我们从记录发送到存储过程的内容开始。如果您修改存储过程以记录传入的数据并更新行数,您看到了什么?

CREATE TABLE update_proc_log (
  id_korisnika varchar2(200),
  ime_korisnika varchar2(200),
  prezime_korisnika varchar2(200),
  broj_telefona varchar2(30),
  adresa_korisnika varchar2(400),
  rows_updated     number,
  call_timestamp   timestamp
);



CREATE OR REPLACE PROCEDURE Update_korisnika(
    stari_id IN varchar,
    novo_ime_korisnika IN varchar2,
    novo_prezime_korisnika IN varchar2,
    novi_broj_telefona_korisnika IN varchar2,
    nova_adresa_korisnika IN varchar2)

IS
  l_rows_updated integer;
BEGIN
    UPDATE Korisnici 
    SET Korisnici.ime_korisnika=novo_ime_korisnika
        , Korisnici.prezime_korisnika=novo_prezime_korisnika
        , Korisnici.broj_telefona=novi_broj_telefona_korisnika
        , Korisnici.adresa_korisnika=nova_adresa_korisnika 
    WHERE Korisnici.id_korisnika=stari_id;
    l_rows_updated := sql%rowcount;

    INSERT INTO update_proc_log( id_korisnika ,
                                 ime_korisnika ,
                                 prezime_korisnika ,
                                 broj_telefona ,
                                 adresa_korisnika ,
                                 rows_updated ,
                                 call_timestamp )
      VALUES( stari_id,
              novo_ime_korisnika,
              novo_prezime_korisnika,
              novi_broj_telefona_korisnika,
              nova_adresa_korisnika ,
              l_rows_updated,
              systimestamp );
    COMMIT;
END;
/