使用Oracle DataAccess .dll在.NET 4.0,C#中获取ORA-01426:数字溢出

时间:2011-07-05 17:41:23

标签: .net asp.net oracle c#-4.0 ora-01426

我正在尝试使用Visual Studio 2010,.Net 4,C#编写一个非常简单的网页。我正在使用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();

3 个答案:

答案 0 :(得分: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();
        }
     }

答案 1 :(得分:1)

如果per_id_no是varchar2数据类型,那么您可能需要将值放在单引号中。
string sql =“SELECT * from users.training WHERE per_id_no ='”+ strIdNo +“'”;

当然,我完全同意@jgauffin,在这种情况下,我认为查询应该如下所示 string sql =“SELECT * from users.training WHERE per_id_no ='@ id'”;
但我非常肯定在Oracle中,参数应该是:id而不是@id,我相信它是SQL Server语法。

无论如何,HTH
HARV

答案 2 :(得分:0)

对于包含它的类型,

strIdNo可能太大。检查以确保它不需要引用(将其转换为字符串)。另外,请检查per_id_no列的类型,以确保它是您期望的类型(并且strIdNo可以适合它)。