1

我正在尝试使用 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();
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,在这种情况下,我认为查询应该看起来像这样的
字符串 sql = "SELECT * from users.training WHERE per_id_no = '@id'";
但我很确定在 Oracle 中参数应该是 :id 而不是 @id 我相信这是 SQL Server 语法。

无论如何,HTH
Harv

于 2011-07-05T18:55:11.470 回答
0

strIdNo对于包含它的类型来说可能太大了。检查以确保它不需要被引用(将其转换为字符串)。还要检查per_id_no列的类型以确保它是您期望的类型(并且strIdNo可以放入其中)。

于 2011-07-05T17:52:55.657 回答