Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle trong C #, các biến liên kết và các truy vấn như ID IN (1, 2, 3)

Mã:

oraParam.UdtTypeName = "SYS.ODCINUMBERLIST";
VArray newArray = new VArray();
newArray.Array = new Int32[] {12,24,42};
oraParam.OracleDbType = OracleDbType.Array;
oraParam.Value = newArray;

string query = @"Select * from TABLE(:1) ";
OracleCommand command = new OracleCommand(query, MyConnection);
command.Parameters.Add(oraParam);
OracleDataReader reader;
var m_connection = new OracleConnection("The CONNECTION STRING");
m_connection.Open();
var reader = command.ExecuteReader();
reader.Close();
m_connection.Close();

Tiếp theo là các Lớp trợ giúp sau:

class VArray : IOracleCustomType, INullable
{
    [OracleArrayMapping()]
    public Int32[] Array;

    private OracleUdtStatus[] m_statusArray;
    public OracleUdtStatus[] StatusArray
    {
        get
        {
            return this.m_statusArray;
        }
        set
        {
            this.m_statusArray = value;
        }
    }

    private bool m_bIsNull;

    public bool IsNull
    {
        get
        {
            return m_bIsNull;
        }
    }

    public static VArray Null
    {
        get
        {
            VArray obj = new VArray();
            obj.m_bIsNull = true;
            return obj;
        }
    }

    public void ToCustomObject(OracleConnection con, IntPtr pUdt)
    {
        object objectStatusArray = null;
        Array = (Int32[])OracleUdt.GetValue(con, pUdt, 0, out objectStatusArray);
        m_statusArray = (OracleUdtStatus[])objectStatusArray;
    }

    public void FromCustomObject(OracleConnection con, IntPtr pUdt)
    {
        OracleUdt.SetValue(con, pUdt, 0, Array, m_statusArray);
    }

    public override string ToString()
    {
        if (m_bIsNull)
            return "VArray.Null";
        else
        {
            string rtnstr = String.Empty;
            if (m_statusArray[0] == OracleUdtStatus.Null)
                rtnstr = "NULL";
            else
                rtnstr = Array.GetValue(0).ToString();
            for (int i = 1; i < m_statusArray.Length; i++)
            {
                if (m_statusArray[i] == OracleUdtStatus.Null)
                    rtnstr += "," + "NULL";
                else
                    rtnstr += "," + Array.GetValue(i).ToString();
            }
            return "VArray(" + rtnstr + ")";
        }
    }
}

[OracleCustomTypeMapping("SYS.ODCINUMBERLIST")]
public class VArrayFactory : IOracleCustomTypeFactory, IOracleArrayTypeFactory
{
    // IOracleCustomTypeFactory
    public IOracleCustomType CreateObject()
    {
        return new VArray();
    }

    // IOracleArrayTypeFactory Interface
    public Array CreateArray(int numElems)
    {
        return new Int32[numElems];
    }

    public Array CreateStatusArray(int numElems)
    {
        // CreateStatusArray may return null if null status information 
        // is not required.
        return new OracleUdtStatus[numElems];
    }
}

MÔ TẢ:

Ý tưởng chung là tương tự như ví dụ OCI, bạn phải ép kiểu tham số dưới dạng SYS.ODCINUMBERLIST (Hoặc kiểu hợp lệ khác). Loại đó không được xác định theo mặc định trong C # OracleDBType, vì vậy bạn phải sử dụng UdtTypeName và Factory / Class tùy chỉnh để liên kết thành công.

Điều này được lấy cảm hứng từ bài đăng sau về xác định các loại tùy chỉnh .

Giới hạn:

Giải pháp chính xác này sẽ chỉ hoạt động với các giá trị INT / NUMBER bởi vì nó dựa trên loại bảng SYS.ODCINUMBERLIST. Nếu cần cho các loại khác, bạn có thể cần tìm / viết các loại bảng tùy chỉnh bổ sung.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm nguồn dữ liệu cho bảng nhất định - ORACLE

  2. Tạo phạm vi ngày từ hai cột ngày

  3. Khi nào sử dụng gợi ý trong truy vấn tiên tri

  4. Cảnh báo PHP khi khởi động khi cố gắng tải php_oci8.dll

  5. Cách tìm hiểu xem tài trợ chọn lọc được nhận trực tiếp hay thông qua một vai trò