1

Visual Studio 2010、.Net 4、C# を使用して非常に単純な Web ページを作成しようとしています。私は Oracle DataAccess .DLL を使用しており、データベースに正常に接続しています。このコードを実行すると、「ORA-01426: Numeric Overflow」という例外が発生します。計算は一切行っていません。クエリを送信する前に、すべてを文字列に入れています。以下は私のコード サンプルです。

string sql = "SELECT * from users.training WHERE per_id_no = " + strIdNo;
        OracleCommand cmd = new OracleCommand(sql, conn);
        cmd.CommandType = System.Data.CommandType.Text;

        try
        {
            Label1.Visible = false;
            //Read data from the database
            OracleDataReader dr = cmd.ExecuteReader(); // C#
            dr.Read();
4

3 に答える 3

2

これは答えではありませんが、コードは SQL インジェクションに対して脆弱です。パラメーターを SQL ステートメントに直接含めないでください。代わりに名前付き引数を使用します。

    string sql = "SELECT * from users.training WHERE per_id_no = @id";
    using (var cmd = conn.CreateCommand()) 
    {
        cmd.CommandText = sql;

        //syntax differs between different providers
        cmd.Parameters.Add("id", strIdNo); 

        try
        {
            Label1.Visible = false;
            OracleDataReader dr = cmd.ExecuteReader();
            dr.Read();
        }
     }
于 2011-07-05T17:56:31.243 に答える
1

per_id_no が varchar2 データ型の場合、おそらく値を一重引用符で囲む必要があります。
string sql = "SELECT * from users.training WHERE per_id_no = '" + strIdNo + "'";

もちろん、私は @jgauffin に完全に同意します。その場合、クエリは次の
文字列のように見えるはずだと思います。
しかし、Oracle では、パラメーターは :id であり、SQL Server の構文であると思われる @id ではないと確信しています。

とにかく、HTH
Harv

于 2011-07-05T18:55:11.470 に答える
0

strIdNoそれを含むタイプには大きすぎる可能性があります。引用符で囲む必要がないことを確認してください (文字列に変換するため)。また、列の型をチェックして、per_id_noそれが期待する型であること (および列にstrIdNo収まる型であること) を確認します。

于 2011-07-05T17:52:55.657 に答える