在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));
答案 0 :(得分:1)
你似乎做对了。将RETURNING INTO
和ExecuteNonQuery
与输出参数一起使用。考虑到您正在使用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();
}
}