Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中使用单个命令将SQL插入并选择到Oracle中_C#_.net_Oracle - Fatal编程技术网

C# 在.NET中使用单个命令将SQL插入并选择到Oracle中

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

我试图执行一个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代码中使用它:


这回答了你的问题吗?对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);
}