问一个Oracle和C#的数据库访问中,Sql参数的问题
是这样的,很久没用Oracle了
最近一个项目中需要用到Oracle,结果出现了很奇怪的问题,出示事例代码:
OracleConnection con = ConnectionInfo.GetConnection();
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "UPDATE T_GROUP SET NAME = :NAME, VALUE = :VALUE WHERE ID = :ID ";
cmd.Parameters.Add( ":ID ", OracleDbType.Varchar2).Value = "AE279B5E3C504F5BA91D139AAE3B1864 ";
cmd.Parameters.Add( ":NAME ", OracleDbType.NVarchar2).Value = "美女与野兽12 ";
cmd.Parameters.Add( ":VALUE ", OracleDbType.Int16).Value = 2;
try
{
con.Open();
int r = cmd.ExecuteNonQuery();
Console.WriteLine(r);
}
catch (OracleException err)
{
throw err;
}
finally
{
if (con.State == System.Data.ConnectionState.Open)
{
con.Close();
}
}
--数据库
create table T_GROUP
(
id VARCHAR2(32) default SYS_GUID() not null,
name NVARCHAR2(20) not null,
value NUMBER(4) default -1 not null
)
就这么一个简单的表
但是执行这个程序,总是报ORA-01722: 无效数字
如果不加WHERE条件 或者WHERE ID IS NOT NULL 则可以通过
如果是WHERE条件不改变 去掉SQL中的VALUE列,也可以通过
不知道各位有没有遇到这种情况
[解决办法]
ID设置是number啊,看看这个呢,我在家没办法调试,呵呵
参考:http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm
Decimal Oracle NUMBER type
貌似应该用dbtype应该用decimal
[解决办法]
因为你用的是Oracle公司提供的dll,而不是微软提供的,因此有个属性必须设置
OracleCommand cmd = con.CreateCommand(); cmd.BindByName = true;