2012-04-25 5 views
0

私には気になる点があります。私は、IDataReader.Read()がIDbCommand.CommandTextの設定方法に応じて異なる動作をしていることに気付きました。IDataReader.Read()を使用した動作が一貫しない

'AID'が設定され、EntAgencyId()に渡された場合、reader.Read()はtrueを返し、プログラムはwhileループに入ることができます。私が関数( '455')に渡している同じ値を使用してEntAgencyId()で 'query'を設定した場合、プログラムはwhileループに入ることはできません(同じ動作は 'AID'を渡すときに起こります) textbox.text)。

public string EntAgencyId(string AID) 
{ 
    cmd = uasConnection.CreateCommand(); 
    //query = "select * from EnterpriseAgencyTbl where AOCId = " + AID; //<--Works 
    query = "select * from EnterpriseAgencyTbl where AOCId = 455"; //<--Causes issue 

    cmd.CommandText = query; 
    reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 
     EntAgId = reader["Id"].ToString(); 
     AgencyName = reader["Name"].ToString(); 
    } 

    reader.Close(); 
    return AgencyName; 
} 

デバッグ時には、 'query'は常に同じ値になりますが、なぜこれが.Read()と異なるのでしょうか。

思考のための食べ物 - .Read()は、さらに行がある場合はtrueを返します。それ以外の場合はfalseです。この場合、ItemプロパティとGetValue()を使用して最初の単一の行を読み取ろうとしましたが、両方とも 'オブジェクトのインスタンスに設定されていません'というエラーが発生します。

私は完全にアイデアを使い果たしているので、どんな助けもありがとう!

+1

私はあなたの診断が間違っていると強く思っています。 1つのクエリ文字列が構築されていますが、どのようなものが構築されたかは何も気にしません。 (もちろん、SQLの一部としてテキストボックス値を使用してクエリを構築するべきではありません。パラメータ化されたSQLを代わりに使用してください) –

+0

'EntAgencyId'を呼び出すコードを追加できますか? – phoog

+0

好奇心から、AOCId列の種類は何ですか?そして、文字列 "'455'(目盛り付き)を関数に渡していますか? 「455」ですか? –

答えて

2

AIDが信頼できない情報源から来た場合、は本当ににパラメータを使用する必要があります。

代わりに次のコードを使用します。

query = "select * from EnterpriseAgencyTbl where AOCId = @AOCId"; 

cmd.CommandText = query; 
cmd.Parameters.Add(new SqlParameter("@AOCId", SqlDbType.Int) { Value = int.Parse(AID) }); 

次に、このような静的入力、使用して同じように動作している場合参照してください。

cmd.Parameters.Add(new SqlParameter("@AOCId", SqlDbType.Int) { Value = 455 }); 

注:私は "に基づいて、仮定を作ってるんだがAOCIdはint型です。

+0

+1はパラメータ化されたクエリです。 – zimdanen

関連する問題