如何在 OracleCommand INSERT INTO 之后检索 sys_guid() 的值

Posted

技术标签:

【中文标题】如何在 OracleCommand INSERT INTO 之后检索 sys_guid() 的值【英文标题】:How can you retrieve the value of sys_guid() after an OracleCommand INSERT INTO 【发布时间】:2020-05-16 21:00:32 【问题描述】:

我想在事务中检索包含 Oracle db 生成的 sys_guid() 的特定列的值。

public string GetGUID(OracleConnection connection) 
 
  string guid = "";
  connection.Open();
  OracleCommand cmd = new OracleCommand();
  OracleTransaction transaction;
  transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
  cmd.Transaction = transaction;
  cmd.Connection = connection;
  try
  
   cmd = connection.CreateCommand();
   cmd.CommandText = "INSERT INTO CUSTOMERS (NAME,DETAILS) VALUES (:nm, :dts)";
   cmd.Parameters.Add("nm", OracleDbType.VarChar);
   cmd.Parameters["nm"].Value = name;
   cmd.Parameters.Add("dts", OracleDbType.VarChar);
   cmd.Parameters["dts"].Value = details;
   cmd.Prepare();
   OracleDataReader reader = cmd.ExecuteReader();
   while (reader.Read())
   

   
   reader.Close();
   transaction.Commit();
  
  catch (Exception e)
  
      transaction.Rollback();
      Console.WriteLine(e.Message);
      
 return guid;

表 CUSTOMERS 有一个列 ORDER,它使用 SYS_GUID() 创建一个 guid,我如何检索该 guid?

【问题讨论】:

"INSERT INTO CUSTOMERS (NAME,DETAILS) VALUES (:nm, :dts) RETURNING \"ORDER\" INTO :orderid " 侧节点:你没有什么可看的,这就是为什么cmd.ExecuteNonQuery(); 抱歉误导 :orderid,我更正了。我没有在 order 列中插入任何值,我使用 sys_guid() 离开 Oracle 数据库来填充它。 sqlines.com/oracle-to-sql-server-cs-conversion/… 【参考方案1】:

试试returning .. into clause 例如

   ...

   using (OracleCommand cmd = connection.CreateCommand()) 
     cmd.CommandText = 
       @"INSERT INTO CUSTOMERS (
           NAME,
           DETAILS) 
         VALUES (
           :nm, 
           :dts)
         RETURNING 
           ""ORDER"" INTO :orderid";

     cmd.Parameters.Add("nm", OracleDbType.VarChar);
     cmd.Parameters["nm"].Value = name;
     cmd.Parameters.Add("dts", OracleDbType.VarChar);
     cmd.Parameters["dts"].Value = details;

     cmd.Parameters.Add("orderid", OracleDbType.VarChar);  
     cmd.Parameters["orderid"].Direction = ParameterDirection.Output;

     try 
       cmd.ExecuteNonQuery(); // Just execute, nothing to read
       transaction.Commit(); 

       guid = Convert.ToString(cmd.Parameters["orderid"].Value);
     
     catch (Exception e)  //TODO: put more specific exception type
       transaction.Rollback();   
       Console.WriteLine(e.Message);     
      

     return guid;
     

   ...

【讨论】:

工作得很好,我使用查询“插入客户(名称,详细信息)值(:nm,:dts)返回订单到:orderid”没有@前缀。非常感谢!

以上是关于如何在 OracleCommand INSERT INTO 之后检索 sys_guid() 的值的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 OracleCommand 使用 OracleTransaction 将父表的 id 传递给子表

OracleCommand 命令,ExecuteNonQuery 问题

简单的 Oracle 查询返回 OracleCommand.CommandText 无效

OracleCommand.CommandText 中的查询文本是不是有最大长度?

OracleCommand SQL 参数绑定

OracleCommand ExecuteScalar 有时返回 null