2012-03-02 104 views
-1

我將varchar,nvarchar2或varchar2與傳遞給Oracle數據庫的QString變量進行比較時遇到問題。使用QString比較(varchar,nvarchar2,varchar2)

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

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

then:

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觸發時追蹤它。

+0

究竟是什麼問題?如果問題在於存儲過程沒有更新任何數據,您能否記錄正在傳入的'stari_id'?什麼是傳入的'stari_id',以及您希望更新的行的id_korisnika是什麼?在一個結尾處是否有空格,或者是否有空格? – 2012-03-02 22:30:33

+0

問題是當我想添加項目時,我可以使它正常。但是當我想更新例如更改數據。我需要使用從QT代碼發送的old_id(stari_id)作爲Qstring id,並且什麼都不會發生。之間的QT和甲骨文我有PHP腳本處理數據,但腳本工作正常。 oracle和QT在投射方面有一些問題。當我將數據發佈到oracle時,我會對其進行調試,並且可以看到我正在將id_user(id_korisnika)作爲「3」發送。但沒有更新 – 2012-03-02 22:38:08

+0

1)如果'id_korisnika'是一個數字,它應該被定義爲數據庫中的NUMBER,而不是字符串。 2)您是否聲明您已登錄存儲過程,該存儲過程指示正在傳入的'STARI_ID'是不帶前導或尾隨空格的字符串'3',並且您可以查詢'Korisnici'表並查看'id_korisnika'爲'3'且'UPDATE'語句沒有更新行? – 2012-03-02 22:53:33

回答

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; 
/
+0

ID未顯示。但我可以看到,例如名稱已更改。但id是空的空間。 – 2012-03-02 23:40:48

+0

@denonth - ID不顯示在哪裏?在日誌表中?日誌表中是否有一行?什麼是日誌表中的ROWS_UPDATED設置? – 2012-03-02 23:47:18

+0

我這樣做'select * from update_proc_log' – 2012-03-02 23:49:37

2

「在開始時id_korisnika是因爲號碼,然後我試圖 更改爲varchar,NVARCHAR2,VARCHAR2,但是仍然有一些這樣的問題。我 不知道如何跟蹤它在存儲過程中調用select * 來自Korisnici在SQL plus中我可以看到數字3。

好的,所以你的實際問題是你正在一個字符串數據類型中存儲一個數字。它在查詢中看起來可能類似於3,但它可能是' 3','3 ',' 3 ','3'或三個和空間的任何其他排列。

所以,只需要清理你的數據模型。