【问题标题】:How to pass c# object to Oracle?如何将 c# 对象传递给 Oracle?
【发布时间】:2020-07-12 14:23:39
【问题描述】:

我有我的 c# 对象

public class Person
{
    
    public string Name { get;set; }
    public string Surname{ get;set; }
    public string Phone { get;set; }
    public string Address { get;set; }
    // More properties here
}

所以,我以这种方式将它传递给 oracle 存储过程

var con = new OracleConnection("connection string");
var com = con.CreateCommand("create_user");
com.Parameters.Add("name", OracleDbType.Varchar2, Name , ParameterDirection.Input);
com.Parameters.Add("surname", OracleDbType.Varchar2, Surname, ParameterDirection.Input);
com.Parameters.Add("phone", OracleDbType.Varchar2, Phone , ParameterDirection.Input);
// More adds here

我的预言机程序

CREATE OR REPLACE PROCEDURE Person(
       name IN Person.name%TYPE,
       surname IN Person.surname%TYPE,
       phone IN Person.phone%TYPE,
       address IN Person.address%TYPE
       -- more parameters
       )
IS
BEGIN

  INSERT INTO Person ("name", "surname", "phone", "address")
  VALUES (name, surname,phone, address);

  COMMIT;

END;
/

问题是:还有其他方法可以将对象传递给oracle吗?因为我认为创建具有 10 多个输入参数的过程有点奇怪。还是更好的使用 xml(clob) 通信?

【问题讨论】:

  • 更好的方法,但它们仍然涉及独立传递字段参数。
  • 当您可以直接运行INSERT 查询时,为什么还要创建一个过程来运行INSERT 查询?
  • 如果您不想在procedure中输入10+个参数,您可以在oracle中创建UDT并使用它。但是从 C# 开始,您仍然需要映射所有属性。您可以查看此link 以供参考。
  • @Rajeev 谢谢,它有效。如果您将答案写在答案块中,我会将其标记为解决方案

标签: c#


【解决方案1】:

如果您不想在procedure中输入10+个参数,您可以在oracle中创建UDT并使用它。

但从 C# 开始,您仍然需要映射所有属性。

您可以查看此link 以供参考

【讨论】:

    【解决方案2】:

    使用Dapper.Contrib,你可以简单地写成

    connection.Insert(Person);
    

    Dapper 将为您映射所有参数。

    当然,这只有在您愿意放弃存储过程时才有效。如果您坚持使用存储过程,您仍然必须单独填充每个参数,即使使用 Dapper。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2015-08-30
      相关资源
      最近更新 更多