예제 #1
0
        private static OdbcReturnCode GetDiagnosticRecord(OdbcHandle handle, short recordNumber, out string state, StringBuilder messageBuffer, out short bufferLengthNeeded)
        {
            var stateBuffer = new StringBuilder(5);
            int nativeError;

            var result = NativeMethods.SQLGetDiagRecW(handle.HandleType, handle, recordNumber, stateBuffer, out nativeError, messageBuffer, (short)messageBuffer.Capacity, out bufferLengthNeeded);

            if ((result == OdbcReturnCode.Success) || (result == OdbcReturnCode.SuccessWithInfo))
            {
                state = stateBuffer.ToString();
            }
            else
            {
                state = null;
            }

            return result;
        }
예제 #2
0
 internal static extern OdbcReturnCode SQLGetDiagRecW(OdbcHandleType handleType, OdbcHandle handle, short recordNumber, StringBuilder stateBuffer, out int nativeError, StringBuilder messageBuffer, short bufferLength, out short bufferLengthNeeded);
예제 #3
0
        internal static Exception GetException(OdbcHandle handle, string message)
        {
            var errors = new List<OdbcError>();
            var messageBuffer = new StringBuilder(512);
            short recordNumber = 1;

            while (true)
            {
                string state;
                short bufferLengthNeeded;

                var result = GetDiagnosticRecord(handle, recordNumber, out state, messageBuffer, out bufferLengthNeeded);

                if (result == OdbcReturnCode.SuccessWithInfo)
                {
                    var neededCapacity = bufferLengthNeeded + 1;

                    if (messageBuffer.Capacity < neededCapacity)
                    {
                        messageBuffer.Capacity = neededCapacity;
                        result = GetDiagnosticRecord(handle, recordNumber, out state, messageBuffer, out bufferLengthNeeded);
                    }
                }

                if ((result != OdbcReturnCode.Success) && (result != OdbcReturnCode.SuccessWithInfo))
                {
                    break;
                }

                errors.Add(new OdbcError(state, messageBuffer.ToString()));
                recordNumber++;
            }

            return CreateException(message, errors);
        }