sql >> データベース >  >> RDS >> Oracle

Oracle in C#、バインド変数、ID IN(1、2、3)などのクエリ

    コード:

    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();
    

    その後に次のヘルパークラスが続きます:

    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];
        }
    }
    

    説明:

    一般的な考え方は、OCIの例と同様に、パラメーターをSYS.ODCINUMBERLIST(または他の有効なタイプ)としてキャストする必要があるということです。このタイプはC#OracleDBTypeでデフォルトで定義されていないため、正常にバインドするにはUdtTypeNameとカスタムファクトリ/クラスを使用する必要があります。

    これは、カスタムタイプの定義に関する次の投稿

    制限:

    この正確なソリューションは、SYS.ODCINUMBERLISTテーブルタイプから便乗しているため、INT/NUMBER値でのみ機能します。他のタイプで必要な場合は、追加のカスタムテーブルタイプを検索/作成する必要がある場合があります。




    1. 挿入前にテーブル内の重複しない行をチェックする手順(Oracle)

    2. SSHを使用したLaravelMySqlDB接続

    3. json_encodeの実行後に\r\ n(改行文字)を置き換える

    4. 惑星の配置