社区
C#
帖子详情
oracle存储过程执行事物的问题 在线等
tksnow
2006-12-21 01:33:24
oracle9i中我建了两个存储过程,分别向主从表中insert数据,两个存储过程分别单独执行是成功的。但是建立在一个事物中,只有第一个执行成功,执行第二个的时候提示ORA-01036: 非法的变量名/编号.
请教各位怎么解决这个问题.谢谢!!!
...全文
466
24
打赏
收藏
oracle存储过程执行事物的问题 在线等
oracle9i中我建了两个存储过程,分别向主从表中insert数据,两个存储过程分别单独执行是成功的。但是建立在一个事物中,只有第一个执行成功,执行第二个的时候提示ORA-01036: 非法的变量名/编号. 请教各位怎么解决这个问题.谢谢!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
24 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tksnow
2006-12-21
打赏
举报
回复
感谢大家问题解决了。 comm.Parameters.Clear(); 清除了一下。
可是我一开始写的时候就没用一个command,报错提示我要有一个command事务。我有点记不清楚了。
liujia_0421
2006-12-21
打赏
举报
回复
这样试试:
oraComm.Parameters.Clear();
oraComm.Parameters.Add(new OracleParameter("byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
yan63
2006-12-21
打赏
举报
回复
怎么清除command参数保留
----------------------------
comm.Parameters.Clear();
弱弱的啰嗦一下,真的没必要在一个command...
tksnow
2006-12-21
打赏
举报
回复
怎么清除command参数保留
yan63
2006-12-21
打赏
举报
回复
在同一个事物中要用同一个command
------------------------------------
没有必要,只要使用一个connnection就可以了,如果一定要同一个command,看一下第二条语句运行前是否把前面insert的参数清空
tksnow
2006-12-21
打赏
举报
回复
oraComm.Parameters.Add(new OracleParameter("byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
改成这样也不行。
在同一个事物中要用同一个command.
yan63
2006-12-21
打赏
举报
回复
为什么所有的insert要在一个command里做呢?完全可以new一个新的command,可能是你上一个insert的command参数保留,下一个insert没有这个参数,就有这样的问题,
liujia_0421
2006-12-21
打赏
举报
回复
别弄错了,这里的不用改..
else
{
strSql += "',:byteZrzp)";
}
这个是要加上的...
liujia_0421
2006-12-21
打赏
举报
回复
TO:
oraComm.Parameters.Add(new OracleParameter(":byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
改成这样试试:
oraComm.Parameters.Add(new OracleParameter("byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
记得好像Oracle添加参数时,赋值是,参数前的":"要去掉...试试看..
tksnow
2006-12-21
打赏
举报
回复
使用的是一个connection,第一个注掉执行第二个是可以执行的。我跟踪了就是只要有照片信息,即执行if (m_byteZrzp != null)
{
oraComm.Parameters.Add(new OracleParameter(":byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
}
时有这个LongRaw字段,我加的是二进制照片信息。第一个insert是可以执行成功的,
再执行第二个insert 就会报错了。ORA-01036: 非法的变量名/编号.
如果不照片为null则执行是没有问题的。
yan63
2006-12-21
打赏
举报
回复
oraComm.Connection = m_OracleConn;
oraComm.CommandText = strSql;
-----------------------------------
oraComm是你外部传入的,两个insert要使用事务的话,应该使用同一个oracle connection
m_QzrXx.Insert(oraComm)与m_QXx.Insert(oraComm);使用同一个connection吗
liujia_0421
2006-12-21
打赏
举报
回复
跟踪一下看具体执行到什么地方时抛出的异常...
liujia_0421
2006-12-21
打赏
举报
回复
你所谓的存储过程不是真正意义上的数据库存储过程吧...
只是把一个操作放在一个方法里写了..
liujia_0421
2006-12-21
打赏
举报
回复
那你试着把第一个存储过程注释掉,只调用第二个存储过程可以成功吗?
tksnow
2006-12-21
打赏
举报
回复
下面的代码是一个insert方法,也不是调用数据库的存储过程。请大家看一下。
所有的insert方法都类似。
public int Insert(OracleCommand oraComm)
{
string strSql = "Insert into T_QZRXX(QZRBH,XBDM,GJDM,PCSDM,ZJLXDM,ZRXM,ZRZJH,ZRNL," +
"JTZJ,GZDW,DWDH,GDDH,YDDH,YJDZ,DJSJ,BZ,ZP)" +
"values" +
"(" +
"S_T_QZRXX_QZRBH.NEXTVAL"
+ ",'" + m_strXbID
+ "','" + m_strGjdm
+ "','" + m_strPcsId
+ "','" + m_strZjlxId
+ "','" + m_strZrxm
+ "','" + m_strZrzjh
+ "','" + m_strZrnl
+ "','" + m_strJtzz
+ "','" + m_strZrgzdw
+ "','" + m_strZrdwdh
+ "','" + m_strZrgddh
+ "','" + m_strZryddh
+ "','" + m_strZryjd
+ "',sysdate"
+ ",'" + m_strZrbz;
if (m_byteZrzp == null) //照片为空值
{
strSql += "',null)";
}
else
{
strSql += "',:byteZrzp)";
}
oraComm.Connection = m_OracleConn;
oraComm.CommandText = strSql;
if (m_byteZrzp != null)
{
oraComm.Parameters.Add(new OracleParameter(":byteZrzp", OracleType.LongRaw)).Value = m_byteZrzp;
}
return oraComm.ExecuteNonQuery();
}
tksnow
2006-12-21
打赏
举报
回复
没有联系。
tksnow
2006-12-21
打赏
举报
回复
没有任务联系。
liujia_0421
2006-12-21
打赏
举报
回复
两个存储过程间有什么联系吗?
tksnow
2006-12-21
打赏
举报
回复
是同一个数据库连接。
代码如下
Insert方法为调用存储过程插入数据
public bool Save()
{
OracleCommand oraComm = new OracleCommand();
OracleTransaction oracleTran = m_OracleConn.BeginTransaction();
oraComm.Transaction = oracleTran;
try
{
m_QzrXx.Insert(oraComm);
m_QXx.Insert(oraComm);
m_GrYqJl.Qbh = m_QXx.Qbh;
m_GrYqJl.QZrBh = m_QzrXx.Qzrbh;
m_NfJnJl.Qbh = m_QXx.Qbh;
m_GrYqJl.Insert(oraComm);
m_NfJnJl.Insert(oraComm);
oracleTran.Commit(); }
catch (Exception exp)
{
m_DataException = new DataException(exp.Message);
oracleTran.Rollback(); //回滚事务
return false;
}
return true;
}
tksnow
2006-12-21
打赏
举报
回复
用的是OracleTransaction事务
加载更多回复(4)
oracle
存储过程
,函数,自主事务处理
子程序的分类:
存储过程
(
执行
某些操作),函数(
执行
操作并返回结果) 1.2 过程 create [or replace] procedure 过程名 [(参数列表)] is|as 声明变量 begin
执行
语句 [exception 异常处理] end; 1.2.1 过程参数的...
Oracle
存储过程
事务控制语句
Oracle
存储过程
事务控制语句
Oracle
存储过程
的事务
通常情况下,oralce将整个
存储过程
作为一个事务整体,整个过程内的事务,要么都提交,要么都回滚。 2.如果过程内部使用了commit命令或rollback命令,则
存储过程
就能够自行控制整个事务的结束时机,而不受整个会话的...
Oracle
存储过程
中的自治事务
Oracle
存储过程
中的自治事务 自治事务就是创建一个事务中的事务,它能独立于其父事务提交或回滚。利用自治事务,可以挂起当前
执行
的事务,开始一个新事务,然后提交或回滚,所有这些都不影响当前所
执行
事务的状态。...
谨慎使用
Oracle
存储过程
中的commit
目录 ...测试
Oracle
存储过程
中的commit对程序
执行
结果的影响。 二、创建测试示例 1创建demo表 CREATE TABLE "SCOTT"."DEMO" ( "ID" NUMBER NOT NULL , "DESC" VARCHAR2(255 BYTE) ) 2插入
C#
110,499
社区成员
642,576
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章