0

私は気が遠くなるような問題に直面しています。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 行だけを読み取ろうとしましたが、どちらも「オブジェクトがオブジェクトのインスタンスに設定されていません」というエラーが発生します。

私は完全にアイデアを使い果たしたので、助けていただければ幸いです!

4

1 に答える 1

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

注: 名前の「Id」に基づいて、AOCId は int 型であると仮定しています。

于 2012-04-25T14:29:45.160 に答える