public static OciErrorInfo HandleError(OciHandle hand)
        {
            OciErrorInfo info;

            info.ErrorCode    = 0;
            info.ErrorMessage = String.Empty;

            ulong   errbufSize  = 4096;
            UIntPtr errbufSizep = new UIntPtr(errbufSize);
            IntPtr  errbuf      = OciCalls.AllocateClear((int)errbufSize);

            OciCalls.OCIErrorGet(hand,
                                 1,
                                 IntPtr.Zero,
                                 out info.ErrorCode,
                                 errbuf,
                                 (uint)errbufSize,
                                 OciHandleType.Error);

            byte[] bytea = new byte[errbufSize];
            Marshal.Copy(errbuf, bytea, 0, (int)errbufSize);
            errbufSize = 0;

            OciHandle h = hand.Parent;

            if (h == null)
            {
                h = hand;
            }
            if (h == null)
            {
                throw new Exception("Internal driver error: handle is null.");
            }

            // first call to OCICharSetToUnicode gets the size
            OciCalls.OCICharSetToUnicode(h, null, bytea, ref errbufSizep);
            errbufSize = errbufSizep.ToUInt64();
            StringBuilder str = new StringBuilder((int)errbufSize);

            // second call to OCICharSetToUnicode gets the string
            OciCalls.OCICharSetToUnicode(h, str, bytea, ref errbufSizep);

            string errmsg = String.Empty;

            if (errbufSize > 0)
            {
                errmsg = str.ToString();
            }
            else
            {
                errmsg = "Internal driver error. Could not retrieve error message.";
            }

            info.ErrorMessage = String.Copy(errmsg);
            Marshal.FreeHGlobal(errbuf);

            return(info);
        }
        public static OciErrorInfo HandleError(OciHandle hwnd, int status)
        {
            OciErrorInfo info;

            info.ErrorCode    = status;
            info.ErrorMessage = OciGlue.ReturnCodeToString(status);

            if (status == OciGlue.OCI_ERROR || status == OciGlue.OCI_SUCCESS_WITH_INFO)
            {
                OciHandle h = hwnd;
                if (h == null)
                {
                    throw new Exception("Internal driver error: handle is null.");
                }

                ulong   errbufSize  = 4096;
                UIntPtr errbufSizep = new UIntPtr(errbufSize);
                IntPtr  errbuf      = OciCalls.AllocateClear((int)errbufSize);

                OciCalls.OCIErrorGet(hwnd,
                                     1,
                                     IntPtr.Zero,
                                     out info.ErrorCode,
                                     errbuf,
                                     (uint)errbufSize,
                                     OciHandleType.Error);

                byte[] bytea = new byte[errbufSize];
                Marshal.Copy(errbuf, bytea, 0, (int)errbufSize);
                errbufSize = 0;

                // first call to OCICharSetToUnicode gets the size
                OciCalls.OCICharSetToUnicode(h, null, bytea, ref errbufSizep);
                errbufSize = errbufSizep.ToUInt64();
                StringBuilder str = new StringBuilder((int)errbufSize);

                // second call to OCICharSetToUnicode gets the string
                OciCalls.OCICharSetToUnicode(h, str, bytea, ref errbufSizep);

                string errmsg = String.Empty;
                if (errbufSize > 0)
                {
                    errmsg            = str.ToString();
                    info.ErrorMessage = String.Copy(errmsg);
                }
                Marshal.FreeHGlobal(errbuf);
            }
            return(info);
        }