OracleCommand的ExecuteOracleNonQuery(out oracleRowId)方法该怎样用,为什么得不到oracleRowId的值?

hz890 2010-01-11 07:50:07
代码如下:
public string GetOracleRowIdAfterInsertCommand(string OracleConnectionString)
{
string rowId = "";
OracleConnection conn = new OracleConnection(OracleConnectionString);
try
{
OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "begin ";
cmd.CommandText += "INSERT INTO TABLEFORTEST (COLA,COLB) values ('A','B');";
cmd.CommandText += "end;";
conn.Open();
OracleString oracleRowId;
cmd.ExecuteOracleNonQuery(out oracleRowId);
rowId = oracleRowId.Value;
}
finally
{
conn.Close();
}
return rowId;
}

INSERT命令执行成功,记录已插入表中,但是却无法获得RowId,(经调试RowId为null)不知是何原因?
OracleCommand的ExecuteOracleNonQuery(out oracleRowId)方法不应该这么令人失望吧,但是到底该怎样用呢?
请各位高手指点,多谢!
...全文
449 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hz890 2010-01-13
  • 打赏
  • 举报
回复
连续发问过两次都是无果而终!
hz890 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 qldsrx 的回复:]
我对楼主的SQL语句很感兴趣,试试把“begin”和“end”以及insert语句最后的封号去掉执行下看看,我对那个rowId从不关心,所以没有用过那个方法去更新数据库。

其实计算那个方法无法获取rowId,也可以自己写个查询来获取的啊。在你插入后执行这句,如果是返回唯一值,rowid就只有一个,否则就是多个rowid:
SQL codeselect rowidfrom TABLEFORTESTwhere COLA='A'and COLB='B'
[/Quote]
有没有begin...end以及分号并非问题关键,我在11楼已经说过“用ExecuteNonQuery()方法是可以的得到RowId的,但是稍显繁琐”,我的目的是要了解如何通过ExecuteOracleNonQuery(out rowid)方法获取RowId,看来没有人愿意给出合适的答案,那我也只能无满意结贴了!
hz890 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyq11 的回复:]
ADO.NET 访问 Oracle
[/Quote]
不好意思这是一个链接,当时没有看出来!

但是根据该链接所提供的资料是通过建立存储过程来做的,需要这样吗?
直接用PL/SQL语句执行插入命令就不可以获取RowId吗?
cena_jin 2010-01-12
  • 打赏
  • 举报
回复
吼吼!!
hz890 2010-01-12
  • 打赏
  • 举报
回复
没有人能解决吗?
hz890 2010-01-12
  • 打赏
  • 举报
回复
不知各位有没有解决办法?当然前提是要采用OracleCommand的ExecuteOracleNonQuery(out oracleRowId);方法;
因为我也知道利用ExecuteNonQuery()方法是可以的得到RowId的,但是稍显繁琐,所以我还是想用ExecuteOracleNonQuery()方法获取输出的RowId.
qldsrx 2010-01-12
  • 打赏
  • 举报
回复
我对楼主的SQL语句很感兴趣,试试把“begin”和“end”以及insert语句最后的封号去掉执行下看看,我对那个rowId从不关心,所以没有用过那个方法去更新数据库。

其实计算那个方法无法获取rowId,也可以自己写个查询来获取的啊。在你插入后执行这句,如果是返回唯一值,rowid就只有一个,否则就是多个rowid:
select rowid from TABLEFORTEST where COLA = 'A' and COLB='B'
hz890 2010-01-12
  • 打赏
  • 举报
回复
唉,又是无满意结贴。
hz890 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wiki14 的回复:]
cmd.Parameters.Add("oracleRowId", OracleType.Number).Direction = ParameterDirection.Output;
rowId = cmd.Parameters["oracleRowId"].Value;
[/Quote]
报错:ORA-01036: 變數名稱?號碼無效(繁体中文)
我总觉得不应该还需要额外添加参数,因为这个方法唯一的参数就是一个输出的rowid
wiki14 2010-01-11
  • 打赏
  • 举报
回复
cmd.Parameters.Add("oracleRowId", OracleType.Number).Direction = ParameterDirection.Output;
rowId = cmd.Parameters["oracleRowId"].Value;
hz890 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wiki14 的回复:]
C# codeint rowId= cmd.ExecuteOracleNonQuery(out oracleRowId);
[/Quote]
晕!
这样做,rowId的值是受影响的行数(int),而Oracle的RowId在.NET端是一个OracleString类型的参数,我现在就是需要获取这个OracleString类型的参数
hz890 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyq11 的回复:]
ADO.NET 访问 Oracle
[/Quote]
可有具体的解决办法?
wiki14 2010-01-11
  • 打赏
  • 举报
回复

int rowId = cmd.ExecuteOracleNonQuery(out oracleRowId);
hz890 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wiki14 的回复:]
OracleCommand.ExecuteOracleNonQuery 方法:
针对 Connection 执行 SQL 语句并返回受影响的行数。
C# codepublicint ExecuteOracleNonQuery (out OracleString rowid
)

不知道是不是我理解有误。
[/Quote]
返回受影响的行数没有问题,但是为何得不到输出参数rowid的值,如果得不到这个参数值,还不如用ExecuteNonQuery()方法呢!
wiki14 2010-01-11
  • 打赏
  • 举报
回复
OracleCommand.ExecuteOracleNonQuery 方法:
针对 Connection 执行 SQL 语句并返回受影响的行数。

public int ExecuteOracleNonQuery (
out OracleString rowid
)


不知道是不是我理解有误。
wuyq11 2010-01-11
  • 打赏
  • 举报
回复
hz890 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wiki14 的回复:]
跟你的取值方式有问题吧?
[/Quote]
取值方式有何问题?
wiki14 2010-01-11
  • 打赏
  • 举报
回复
跟你的取值方式有问题吧?

110,533

社区成员

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

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

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