2012-02-26 6 views
0

.NETアプリケーションからOracleデータベースにアクセスしています。 ;結果=「」、アサートに失敗した -Oracle SQL文LONGがデータベースから取得されない

using (OracleConnection conn = new OracleConnection(Oradb)) 
{ 
    conn.Open(); 

    string sql = "SELECT RI_DESCRIPTION 
        FROM RI_RISK 
       WHERE RI_CODE = 'GAIL'"; 
    OracleCommand cmd = new OracleCommand(sql, conn); 
    cmd.CommandType = CommandType.Text; 

    OracleDataReader dr = cmd.ExecuteReader(); 
    dr.Read(); 

    var result = dr.GetString(0); 

    Assert.AreEqual("Golden Arches Insurance", result); 
} 

を今、私はこの文は何かを返すように取得することはできません、次のように私のコードの構造があります

しかし、私はこの文が期待されているものを返すために取得することができます。

string sql = "SELECT CLI_ABBRNAME 
       FROM CLI_CLIENT 
       WHERE CLI_CLIENTNUMBER = 00404"; 

私は、テーブル名とカラム名が正しいことをする回数をチェックしています。私が見ることができる唯一の違いは、データ型です:

  • RI_DESCRIPTIONは
  • LONG RI_CODEあるVARCHAR2
  • あるCLI_CLIENTNUMBERはVARCHAR2
  • CLI_ABBRNAMEあるVARHCHAR2

したがって、何か私はそこです私がコードでやっていないLONGと関係がありますか?また、CLI_CLIENTNUMBERは実際にはVARCHAR2です。なぜなら、VARCHAR2のRI_CODEでは、 'GAIL'の周りにアポストロフィが必要です(そうでなければ、無効な識別子?例外

** EDIT

文はSQL Plusを

に完璧に適しています** EDIT - SOLUTION

トリックは、答えのリンクを以下、ORACLECを設定することでしたオブジェクトInitialLONGGetchSizeを-1に設定します。

+0

DBは混乱のように見える:説明は番号(LONG)すべきではない、と番号(LONG)が「ゴールデンアーチ保険」することはできませんどのようなあなたがやっていることに相当します。 –

+1

(アプリケーションからではなく)データベースに対してSQLを直接実行します - 期待される結果が得られることを確認してください –

答えて

1

1つは、LONGを使用しないでください。このフィールドをCLOBに変換する必要があります。 LONGは廃止予定です。

ODP.NETを使用している場合は、"Obtaining LONG and LONG RAW Data"にあります。パラメータInitialLONGFetchSizeが初期値として0に設定されているため、LONGを取得するために値を大きくする必要があります。

技術的には、引用符が必要ですが、列と数値を比較しているため、暗黙の変換があると思います。

SELECT CLI_ABBRNAME 
    FROM CLI_CLIENT 
WHERE TO_NUMBER(CLI_CLIENTNUMBER) = 404 
+0

これは修正済みです!私はあなたの助けにとても感謝しています。 – Hanshan

関連する問題