C# 在.NET中使用单个命令将SQL插入并选择到Oracle中
我试图执行一个SQL命令,在表中插入一条记录并返回generate主键。 我正在使用.NET Core 3.1和Oracle.ManagedDataAccess.Core包 这是执行SQL命令的C代码。它使用了一些扩展方法,但很清楚它是如何工作的: 私有int PutSomethingInTheDatabasestring实体 { 字符串sqlComamnd=File.ReadAllTextSQL///Insert Card.sql; 使用var connection=new Oracle.ManagedDataAccess.Client.oracleConnectionString 使用var命令=connection.OpenAndUse.CreateTextCommandsqlComamnd { //var reader=command.ExecuteReader; //读者。关闭; //var result=command.ExecuteScalar; //返回整数小数结果; 返回-1; } } 理想情况下,我将接收一个值并使用ExecuteScalar读取它。 这是一个集成测试,这就是我从文件中读取SQL的原因 我想要使用的SQL应该插入新记录并返回同一范围/事务中生成的序列,我使用的是Begin/End,但我不确定这是否正确。 我的问题是,我找不到正确的语法来执行最后一个SELECT以返回生成的sequence_id,我还尝试了return 这是SQL: 申报新的身份证号码; 开始 从dual中选择seq_stage_card.NEXTVAL进入新的_id; 插入spin_d.stage_卡 序列号, 字段_1, 字段2 价值观 新身份证, “aaa” 截止日期“2003/05/03 21:02:44”,“yyyy/mm/dd hh24:mi:ss” ; 从dual中选择新的_id,其中1=1;-无效 终止 -返回新的_id;-无效 -从dual中选择新的\u id;-无效 如何更改SQL以返回新的\u id? 还有其他更好的方法可以达到同样的效果吗? 它是安全的隔离作用域,或者如果存在并发插入,select将返回错误的ID [更新] 有人建议使用返回,请参见此处: 我已经尝试过使用RETURN和RETURNING,但是我还没有找到任何使用.NET或其他框架驱动程序的实例,例如OracleSqlCommand和正确的执行调用。 也许它能用,但我还是不知道如何使用它 在一般情况下,当您必须在匿名块中实现某些逻辑,并且返回不是一个选项时,请尝试绑定变量:首先,在查询中将new_id转换为:new_id: 然后在C代码中使用它:C# 在.NET中使用单个命令将SQL插入并选择到Oracle中,c#,.net,oracle,C#,.net,Oracle,我试图执行一个SQL命令,在表中插入一条记录并返回generate主键。 我正在使用.NET Core 3.1和Oracle.ManagedDataAccess.Core包 这是执行SQL命令的C代码。它使用了一些扩展方法,但很清楚它是如何工作的: 私有int PutSomethingInTheDatabasestring实体 { 字符串sqlComamnd=File.ReadAllTextSQL///Insert Card.sql; 使用var connection=new Oracle.Ma
这回答了你的问题吗?对ID通常是Oracle.Decimal,所以我喜欢解析它,因为我不喜欢转换:return intdecimalnewidParameter.Value。谢谢。@Alex 75:口味不同-我爱皈依;如果什么时候?方案改变了,Convert会帮我,比如说,从字符串转换,cast会崩溃,只是为了帮助下一个家伙尝试这段代码。正确的强制转换如下:返回intOracle.ManagedDataAccess.Types.oracledecimilidparameter.Value。我总是使用.NETFramework转换为十进制,也许.NETCore3.x的工作方式有所不同。我还尝试使用Convert.ToInt32,但出现了相同的强制转换错误://System.InvalidCastException:“无法将类型为“Oracle.ManagedDataAccess.Types.OracleDecimal”的对象强制转换为类型为“System.IConvertible”。”再次感谢。
BEGIN
SELECT seq_stage_card.NEXTVAL
INTO :new_id -- bind variable to return back to c#
FROM dual;
INSERT INTO spin_d.Stage_Card (
sequence_id,
field_1,
field_2
)
VALUES (
:new_id,
'aaa',
TO_DATE('2003/05/03 21:02:44', 'yyyy/mm/dd hh24:mi:ss')
);
END;
...
using (var command = connection.OpenAndUse().CreateTextCommand(sqlComamnd))
{
//TODO: check the syntax and RDBMS type
command.Parameters.Add(
":new_id",
OracleDbType.Int32).Direction = ParameterDirection.Output;
// Execute query
command.ExecuteNonQuery();
// Bind variable reading
return Convert.ToInt32(command.Parameters[0].Value);
}