这真是一个大错特错的问题。我简直不敢相信自己的眼睛,如果这是C#中的一个真正的错误,我也不敢相信之前没有人会发现它,所以我将其放出来供其他开发者社区告诉我我做错了什么。我相信这个问题将涉及到我说“噢!”并用手掌猛击自己的头部 - 但无论如何,我们还是开始吧...
为了测试,我创建了一张表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)。
这不仅仅是一个烦恼——它是真正危险的。如果我错位了两个相同数据类型的列会发生什么?我甚至不会收到错误提示——我只会将错误的数据插入错误的列中,而且我自己完全不知情。
除了小心不要按照错误的顺序添加参数,有没有其他的解决方法?