0

次のクエリがあります。

Yii::app()->dbNav->createCommand()
    ->select('*')
    ->from('dbo Spectrum Geo Limited$Purch_ Inv_ Header')       
    ->where('"Log Number" = :id', array(':id'=>$_GET['lognumber']))
    ->queryRow();

そして、次のエラーで失敗しています:

CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 20018 Invalid object name 'dbo'. [20018] (severity 5) [(null)]. The SQL statement executed was: SELECT *
FROM [dbo] [Spectrum Geo Limited$Purch_ Inv_ Header]
WHERE "Log Number" = :id 

私の dblib 接続は mssql で動作します。以下をyiiに変換しようとしています

$sql="SELECT * FROM [Spectrum Geo Limited\$Purch_ Inv_ Header] WHERE [Log Number] = $q ";

Management studio では、必要な結果を得るために次を実行します。

SELECT TOP 1000 *
  FROM [Navision].[dbo].[Spectrum Geo Limited$Purch_ Inv_ Header]
    where [Log Number] = 4593

以下は機能しますが、これは理想的な方法ですか?

Yii::app()->dbNav->createCommand("SELECT * FROM [Spectrum Geo Limited\$Purch_ Inv_ Header] WHERE [Log Number] = ".$_GET['lognumber'] );

さらに遠く

私が次のことをしたら

Yii::app()->dbNav->createCommand()
        ->select('*')
        ->from('[dbo].[Spectrum Geo Limited$Purch_ Inv_ Header]')
        ->where('"Log Number" = :id', array(':id'=>$_GET['lognumber']))
        ->queryRow();

次のエラーが表示されます。

CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 20018 Unclosed quotation mark after the character string 'Geo Limited$Purch_ Inv_ Header]
WHERE "Log Number" = '4593''. [20018] (severity 5) [(null)]. The SQL statement executed was: SELECT *
FROM [[dbo]].[[Spectrum] [Geo Limited$Purch_ Inv_ Header]]
WHERE "Log Number" = :id 

今私は試しました:

Yii::app()->dbNav->createCommand()
        ->select('*')
        ->from('[Spectrum Geo Limited$Purch_ Inv_ Header]')
        ->where('"Log Number" = :id', array(':id'=>$_GET['lognumber']))
        ->queryRow();

エラーで:

CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 20018 Unclosed quotation mark after the character string 'Geo Limited$Purch_ Inv_ Header]
WHERE "Log Number" = '4593''. [20018] (severity 5) [(null)]. The SQL statement executed was: SELECT *
FROM [[Spectrum] [Geo Limited$Purch_ Inv_ Header]]
WHERE "Log Number" = :id 

where句を削除すると、次のエラーが発生します。

CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 20018 Unclosed quotation mark after the character string 'Geo Limited$Purch_ Inv_ Header]'. [20018] (severity 5) [(null)]. The SQL statement executed was: SELECT *
FROM [[Spectrum] [Geo Limited$Purch_ Inv_ Header]] 
4

2 に答える 2

1

テーブルの名前にはスペースが含まれているため、テーブル名を角かっこで囲む必要があります。

一般的に、これは貧弱な設計と見なされますが、これはサードパーティベンダーのデータベースのように見えるため、変更できない場合があります。

編集:[dbo]も必要ないかもしれません...

編集2:現在問題を引き起こしているのはwhere句の列名のスペースです。

編集3:機能する元のクエリを見ると:

Yii::app()->dbNav->createCommand("SELECT * FROM [Spectrum Geo Limited\$Purch_ Inv_ Header] WHERE [Log Number] = ".$_GET['lognumber'] );

そしてそれをこれと比較します:

SELECT * FROM [[Spectrum] [Geo Limited$Purch_ Inv_ Header]] 

角かっこが異なっていることに気付くでしょう。

これを使用すると、機能するはずです。

SELECT * FROM [Spectrum Geo Limited\$Purch_ Inv_ Header]

編集4:

さて、以下を使用するとどうなりますか?

Yii::app()->dbNav->createCommand()
    ->select('*')
    ->from('Spectrum Geo Limited$Purch_ Inv_ Header')       
    ->where('"Log Number" = :id', array(':id'=>$_GET['lognumber']))
    ->queryRow();

dbo.以前はSQLステートメントが機能していなかったため、この部分は省略しています。そこにすべてのスペースを残すことで、以前に頭痛の種を引き起こしていたYii自動ブラケットをアクティブにすることができます...

于 2013-03-20T14:02:22.690 に答える
0

私がこれを試したとき、私にとってはうまくいきました:

$row=Yii::app()->db->createCommand()
->select('*')
->from('wdr_user')
->where('id = :id', array(':id'=>135))
->queryRow();
print_r($row);

where句内の二重引用符を削除すればうまくいくはずです。

于 2013-03-21T07:01:30.267 に答える