我正在尝试使用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();
答案 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
可以适合它)。