执行Oracle insert语句后,如何从触发器返回序列值?

时间:2016-03-18 23:13:45

标签: c# oracle oracle11g

在c#中,执行Oracle insert语句后,我想返回已分配给表中插入记录的序列值,该表具有基于序列的id增量触发器。然后我想将文本框值设置为新的Id

我在搜索之后尝试过这种方式,但这个想法对我来说不是很清楚:

  • 可以id直接返回文本框吗?

  • id关键字之后的单词returning是一个列名吗?

  • 接下来我该怎么办?

    INSERT INTO teams (name) VALUES ('West Ham United') RETURNING id INTO :textbox

我也厌倦了这个

cmd.Parameters.Add(new OracleParameter(parameterName = ":OUT_CUST_ID", OracleDbType.Int64, direction = ParameterDirection.Output));

4 个答案:

答案 0 :(得分:1)

你似乎做对了。将RETURNING INTOExecuteNonQuery与输出参数一起使用。考虑到您正在使用ODP.NET:

string sql = @"INSERT INTO teams (name) 
               VALUES ('West Ham United') 
               RETURNING id INTO :1";

using (var cmd = new OracleCommand(sql, conn))
{
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Add(":1", OracleDbType.Decimal, ParameterDirection.Output);
    // !!! If your output parameter is of String Type, 
    // it is necessary to specify "size"
    if (cmd.ExecuteNonQuery() > 0)
    {
        txtData.Text = ((OracleDecimal)cmd.Parameters[0].Value).ToInt32().ToString();
    }
}

Oracle输出数值参数值实际上是Oracle类型,需要转换。

答案 1 :(得分:0)

使用一个程序(作为一个额外的奖励,您不需要触发器,因为您可以将触发器的逻辑封装到程序中):

CREATE OR REPLACE PROCEDURE add_team(
  i_name IN  TEAMS.NAME%TYPE,
  o_id   OUT TEAMS.ID%TYPE
)
AS
BEGIN
  INSERT INTO teams (
    id,
    name
  ) VALUES (
    TEAMS_SEQ.NEXTVAL,
    i_name
  )
  RETURNING id INTO o_id;
END;
/

然后从您的代码中获取call the procedure

答案 2 :(得分:0)

根据@ T.S。建议我做了一些改变

删除(OracleDecimal) 删除.ToInt32() 替换cmd.Parameters [0]。值 cmd.Parameters [0] .Value

包含参数名称:1

让代码在工作代码

下面工作
    string sql = @"INSERT INTO teams (name) 
               VALUES ('West Ham United') 
               RETURNING id INTO :1";

using (var cmd = new OracleCommand(sql, conn))
{
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Add(":1", OracleDbType.Int32, ParameterDirection.Output);
    // !!! If your output parameter is of String Type, 
    // it is necessary to specify "size"
    if (cmd.ExecuteNonQuery() > 0)
    {
        txtData.Text = (cmd.Parameters[":1"].Value).ToString();
    }
}

答案 3 :(得分:0)

谢谢大家的帮助,下面是一个例子,用于在执行Oracle insert语句后从触发器返回序列值...

 public void data_insert()
    {
        string connstr = "User Id=user;Password=pwd;";
        string cmdtxt = @"insert into customers 
                          (CUST_ID,F_NAME,CUST_PHONE1,CUST_PHONE2,EMAIL)
                          values (null,:TB_NAME,:TB_PHONE1,:TB_PHONE2,:TB_EMAIL)
                          RETURNING CUST_ID into :OUT_ID";

        using (OracleConnection conn = new OracleConnection(connstr))
        using (OracleCommand cmd =new OracleCommand(cmdtxt,conn))
        {
            cmd.Parameters.Add(new OracleParameter("TB_NAME", TB_NAME.Text));
            cmd.Parameters.Add(new OracleParameter("TB_PHONE1", TB_PHONE1.Text));
            cmd.Parameters.Add(new OracleParameter("TB_PHONE2", TB_PHONE2.Text));
            cmd.Parameters.Add(new OracleParameter("TB_EMAIL", TB_EMAIL.Text));

            cmd.Parameters.Add(":OUT_ID", OracleDbType.Decimal, ParameterDirection.Output);

            cmd.CommandText = cmdtxt;
            conn.Open();
            cmd.ExecuteNonQuery();

            TB_CUST_ID.Text = (cmd.Parameters[":OUT_ID"].Value).ToString();
        }
    }