C#调用Oralce存储过程报错。

yelang 2014-01-14 11:16:01
下面我的存储过程代码:

CREATE OR REPLACE PROCEDURE createtable(WellName IN VARCHAR2,
Table_Name IN VARCHAR2,
boiler IN VARCHAR2,
managerarea IN VARCHAR2) AUTHID current_user AS
sqlstr VARCHAR2(500);
BEGIN
sqlstr:='CREATE TABLE '||Table_Name||'(
cjsj DATE,
jkgd NUMBER(10,2),
zryl NUMBER(10,2),
zqwd NUMBER(10,2),
zqsd NUMBER(10,2)
)';
--Dbms_Output.put_line(sqlstr);
EXECUTE IMMEDIATE sqlstr;

sqlstr:='CREATE TABLE '||Table_Name||'_H(
cjsj DATE,
jkgd NUMBER(10,2),
zryl NUMBER(10,2),
zqwd NUMBER(10,2),
zqsd NUMBER(10,2)
)';
--Dbms_Output.put_line(sqlstr);
EXECUTE IMMEDIATE sqlstr;

sqlstr:='CREATE TABLE '||Table_Name||'_D(
cjsj DATE,
jkgd NUMBER(10,2),
zryl NUMBER(10,2),
zqwd NUMBER(10,2),
zqsd NUMBER(10,2),
runhours NUMBER(10)
)';
--Dbms_Output.put_line(sqlstr);
EXECUTE IMMEDIATE sqlstr;

sqlstr:= 'CREATE OR REPLACE TRIGGER '||Table_Name||'_Tri
BEFORE INSERT ON '||Table_Name||
' FOR EACH ROW
BEGIN
HistoryData('''||Table_Name||''',SYSDATE,:new.zryl,:new.jkgd,:new.zqwd,:new.zqsd);
END';
--Dbms_Output.put_line(sqlstr);
EXECUTE IMMEDIATE sqlstr;

sqlstr:='INSERT INTO wells(wname,rtable,boiler,managerarea,issteam,tempstop,stoptimes) VALUES ('''||
WellName||''','''||Table_Name||''','''||boiler||''','''||managerarea||''',''Y'',''N'',0)';
--Dbms_Output.put_line(sqlstr);
EXECUTE IMMEDIATE sqlstr;
END;
/



下面是我在C#里调用这个存储过程的代码:
public bool CreateTables(string wellName,string boiler,string managerArea)
{
string tableName = wellName.Replace("-", "JH");
try
{
OracleParameter[] createPara ={
new OracleParameter(":WellName",OracleType.VarChar,20),
new OracleParameter(":Table_Name",OracleType.VarChar,20),
new OracleParameter(":boiler",OracleType.VarChar,15),
new OracleParameter(":managerarea",OracleType.VarChar,30),
};

createPara[0].Value = wellName;
createPara[1].Value = tableName;
createPara[2].Value = boiler;
createPara[3].Value = managerArea;
OracleHelper.ExecuteNonQuery(CommandType.StoredProcedure, "createtable", createPara);
return true;
}
catch (Exception)
{
return false;
}


下面是报的错误:
ORA-06550: 第 1 行, 第 30 列:
PLS-00103: 出现符号 ":"在需要下列之一时:
( - + case mod new not null
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> continue avg count current exists max min
prior sql stddev sum variance execute forall merge time
timestamp interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe
<一个带有字符集说明的可带引号的字符串文字>
<一个可带引号的 SQL 字符串> purge
符号 "(在 ":" 继续之前已插入。
ORA-06550: 第 1 行, 第 55 列:
PLS-00103: 出现符号 ":"在需要下列之一时:
( - + case mod new not null
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> continue avg count current exists max min
prior sql stddev sum variance execute foral

ORA-06550: 第 1 行, 第 78 列:
PLS-00103: 出现符号 ":"在需要下列之一时:
( - + case mod new not null
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> continue avg count cur


但是我在PL/SQL里直接调用这个存储过程就可以正常执行,只是在C#里调用就出错,这是为什么啊?
EXECUTE createtable('GDD16-1','GDD16JH1','8号站','孤三区302站');

这样执行就可以正常执行,不报错。
...全文
134 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yelang 2014-02-19
  • 打赏
  • 举报
回复
问题解决了,把参数里的冒号去掉就OK了。
qldsrx 2014-01-14
  • 打赏
  • 举报
回复
这个是在存储过程执行当中抛出的异常,也就是存储过程本身无法正常执行,你试试把要传递的参数直接在PL/SQL里面赋值调用看看(断点测试),那样的话如果有错误就会有断点停留,你就能看到哪里出错了。
yelang 2014-01-14
  • 打赏
  • 举报
回复
自己顶起来。
qldsrx 2014-01-14
  • 打赏
  • 举报
回复
如果你用的是ODP.NET,那么要设置OracleCommand的属性BindByName为true才行,那样就按照参数名而不是参数顺序绑定,如果是ADO.NET,那个属性就不存在,肯定是按照参数名绑定的。 由于看不到OracleHelper.ExecuteNonQuery的内部实现,无法确定这个方法是否有问题,这也是给测试带来麻烦的地方,建议先用最原始的方式测通它再用封装的方法,你不能保证该OracleHelper一定没问题吧。
yelang 2014-01-14
  • 打赏
  • 举报
回复
引用 5 楼 qldsrx 的回复:
建议你最好在C#里面启用断点调试,实时查看执行是给的参数值,然后把参数值复制到数据库里面去执行,也许参数值中含有特殊字符导致存储过程中拼接的SQL语句执行失败,这个要看具体传递的参数才知道。 不过建议不要用这种运行模式,参数给的不好就会出现莫名其妙的错误,调试都困难,最好直接将临时表预先创建好,写正常的而非拼接SQL的存储过程。
这个我都试过了,没有问题。 看了你说的之后,我现在唯一不能确定的就是,我不知道C#里的参数顺序会不会变。
qldsrx 2014-01-14
  • 打赏
  • 举报
回复
建议你最好在C#里面启用断点调试,实时查看执行是给的参数值,然后把参数值复制到数据库里面去执行,也许参数值中含有特殊字符导致存储过程中拼接的SQL语句执行失败,这个要看具体传递的参数才知道。 不过建议不要用这种运行模式,参数给的不好就会出现莫名其妙的错误,调试都困难,最好直接将临时表预先创建好,写正常的而非拼接SQL的存储过程。
yelang 2014-01-14
  • 打赏
  • 举报
回复
引用 2 楼 qldsrx 的回复:
这个是在存储过程执行当中抛出的异常,也就是存储过程本身无法正常执行,你试试把要传递的参数直接在PL/SQL里面赋值调用看看(断点测试),那样的话如果有错误就会有断点停留,你就能看到哪里出错了。
可是我直接调用的时候没有报错啊,而且需要建的表和触发器都正常创建了啊。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧