2012-03-02 12 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はどのようなタイプのデータで比較すればいいのですか?私はそれを使うことができます。

EDIT: これは上記QT関数にデータを送信するQML関数である:

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がトリガされたときにどのようにトレースできますか?

+0

正確には、問題は何ですか?問題がストアドプロシージャがデータを更新していない場合は、渡されている 'stari_id'を記録できますか?渡される 'stari_id'とは何ですか?また、更新されると予想される行の' id_korisnika'は何ですか?一方の端にスペースがあり、他方にスペースがないか、ケーシングに違いがありますか? –

+0

問題をノーマルにできるアイテムを追加したいときです。しかし、私が例えば変更データを更新したいとき。私はold_id(stari_id)を使用する必要があります。これはQTコードからQstring IDとして送信し、何も起こりません。 QTとオラクルの間には、データを処理するPHPスクリプトがありますが、スクリプトは正常に動作しています。オラクルとQTはキャストにいくつか問題があります。私がオラクルにデータを投稿すると、それをデバッグすると、私は例えばid_user(id_korisnika)を '3'として送信していることがわかります。しかし、何も更新していない –

+0

1) 'id_korisnika'が数字の場合、実際には文字列ではなくデータベースの' NUMBER'として定義する必要があります。 2)あなたは、STARI_IDが渡されていることを示すストアドプロシージャにログインしていることを伝えていますか?文字列 '3'は先頭または末尾に空白がなく、 'Korisnici'テーブルに問い合わせて、 'id_korisnika'が '3'で、' UPDATE'文が行を更新していないことを確認してください。 –

答えて

1

まず、ストアドプロシージャに送信されているものを記録することから始めましょう。渡されるデータと更新される行数を記録するストアドプロシージャを変更すると、何が表示されますか? id_korisnikaは数通りであった初めの

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は空白です。 –

+0

@denonth - IDはどこに表示されていませんか?ログテーブルには?ログテーブルに行がありますか? 'ROWS_UPDATED'がログテーブルに設定されているのは何ですか? –

+0

私はこれを行う 'select * from update_proc_log' –

2

」、そして、私はそれをvarchar型、NVARCHAR2、VARCHAR2として を変更しようとしました。しかし、問題のいくつかの種類があります。私はそれをトレースする方法がわからない SQL * PlusでKorisniciからselect * を呼び出すと、数字3が表示されます。

さて、実際の問題は、文字列データ型に数値を格納していることです。クエリで3のように見えるかもしれませんが、' 3''3 '' 3 ''3'または3とスペースの他の任意の順列になります。

データモデルを並べ替えるだけです。

関連する問題