【发布时间】:2011-04-22 01:39:33
【问题描述】:
这绝对是咆哮。我不敢相信自己的眼睛,如果这是 C# 中的一个真正的错误,我也不敢相信在我之前没有人会发现这一点,所以我将它发布给开发人员社区的其他人,告诉我我做错了什么。我确信这个问题会让我说“DOH!”并用我的手掌重重地敲打着我的头——但不管怎样……
为了测试,我创建了一个表Test_1,脚本如下:
CREATE TABLE TEST_1 (
COLUMN1 NUMBER(12) NOT NULL,
COLUMN2 VARCHAR2(20),
COLUMN3 NUMBER(12))
TABLESPACE USERS
STORAGE (
INITIAL 64K
MAXEXTENTS UNLIMITED
)
LOGGING;
现在我执行以下代码:
var conn = new OracleConnection("connectionblahblah");
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText =
"insert into Test_1(Column1, Column2, Column3) " +
"values(:Column1, :Column2, :Column3)";
var p = cmd.Parameters;
p.Add("Column1", 1);
p.Add("Column3", null);
p.Add("Column2", "record 1");
cmd.ExecuteNonQuery();
哇!我收到 ORA-01722 错误 - “无效号码”!怎么了? Column1 是数字,值为 1,这很好; Column2 是一个字符串,Column3 是一个可以为空的列,所以应该不会造成任何麻烦...
现在坐下来看看这个...这里的问题是Column3 和Column2 是按照它们添加到OracleParameterCollection 的顺序转置的。切换它们,然后!有效!
当然,这将我引向下一个明显的实验......让我们更改代码块以添加参数,如下所示:
p.Add("Foo", 1);
p.Add("Bar", "record 1");
p.Add("hahahahahahaha", null);
你认为这会奏效吗?猜猜看 - 它做了!
我坐在这里完全惊呆了。我不敢相信我所看到的,我同样不敢相信在我之前没有人发现这种行为(除非我不知道如何正确使用 Google)。
这不仅令人烦恼,而且非常危险。如果我转置了相同数据类型的两列会发生什么?我什至不会出错 - 我只是将错误的数据插入到错误的列中,而且一点也不聪明。
除了注意不要以错误的顺序添加参数之外,是否有人对解决方法有任何想法?
【问题讨论】:
-
您应该提到您使用的是 Oracle 提供程序 (ODP.NET),而不是 Microsoft 的 Oracle 提供程序。前者的行为就像你描述的那样;后者按您的预期工作,但现在已弃用...
-
可悲的是,Access OleDb 也会发生这种情况..
-
@nawfal 确实很伤心。但没有严肃的企业使用 Access 数据库。另一方面,甲骨文...
-
好问题。我刚刚有完全一样的反应。 “哇!WTF 正在进行中!”。
-
2022,它还在这里。