ODP.NET InsertCommand错误地返回ORA-01401:插入的值对于列太大

时间:2011-05-04 19:37:57

标签: c# oracle odp.net

我有一个C#函数正在使用ODP.NET构造一个参数化插入查询,由于某种原因,它继续返回“ORA-01401:插入的值太大而不能用于列”异常。

我已经彻底检查了有问题的字符串变量的长度,它远远低于数据库列的最大大小(在1024个字符长的Varchar2列中长70个字符)。更奇怪的是,如果我将值作为字符串而不是参数变量插入,插入工作就可以了。这是代码(参数化):

connectionString = GetConnectionString();
conn = new OracleConnection(connectionString);
OracleDataAdapter oda = new OracleDataAdapter();
conn.Open();
insertStatement = "INSERT INTO DOCS (ID, PATH, PAGES, USERID,SUFFIX, MASK) ";
insertStatement += "VALUES (:id, :itemUrl, 1, 'SHAREPOINT\\system',0,'000') ";
oda.InsertCommand = new OracleCommand(insertStatement, conn);
oda.InsertCommand.Parameters.Add(":id", docList[0].taskerID.ToString());
oda.InsertCommand.Parameters.Add(":itemUrl", itemUrl);
count += oda.InsertCommand.ExecuteNonQuery();

我在想,也许我在这里找不到ODP.NET,或者我遇到的ODP.NET实际上存在错误。我在我的服务器上使用的是Oracle.DataAccess的9.2.0.7版本。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我只需稍微修改一下代码即可使用,但我没有收到与您相同的异常。

我做的唯一更改是将“INTO”添加到INSERT语句中,并在add集合项中双引号参数名称。


create table DOCS (id varchar2(70) , path varchar2(70) , pages number, userid varchar2(70) , suffix varchar2(70), mask varchar2(70));

OracleDataAdapter oda = new OracleDataAdapter();
insertStatement = "INSERT INTO DOCS (ID, PATH, PAGES, USERID,SUFFIX, MASK) ";
insertStatement += "VALUES (:id, :itemUrl, 1, 'SHAREPOINT\\system',0,'000') ";
conn.Open();
oda.InsertCommand =  new OracleCommand(insertStatement, conn);
oda.InsertCommand.Parameters.Add(":id", "test1");
oda.InsertCommand.Parameters.Add(":itemUrl", "test2");
count += oda.InsertCommand.ExecuteNonQuery();

我认为您可能还有其他事情发生在您的样本中并不明显。

我知道当我的基本顺序中的参数与预期的param集合不同时,我收到了你的错误(很多次)。

这是由默认情况下按位置绑定ODP而不是通过NAME绑定引起的(就像旧的oraClient女士那样)。

您可以验证参数确实位于正确的位置,或者只是:

oda.InsertCommand.BindByName = true ;

HTH