func FormatError(ht C.SQLSMALLINT, h C.SQLHANDLE) (err *ODBCError) { sqlState := make([]uint16, 6) var nativeError C.SQLINTEGER messageText := make([]uint16, C.SQL_MAX_MESSAGE_LENGTH) var textLength C.SQLSMALLINT err = &ODBCError{} i := 0 for { i++ ret := C.SQLGetDiagRecW(C.SQLSMALLINT(ht), h, C.SQLSMALLINT(i), (*C.SQLWCHAR)(unsafe.Pointer(&sqlState[0])), &nativeError, (*C.SQLWCHAR)(unsafe.Pointer(&messageText[0])), C.SQL_MAX_MESSAGE_LENGTH, &textLength) if ret == C.SQL_INVALID_HANDLE || ret == C.SQL_NO_DATA { break } if i == 1 { // first error message save the SQLSTATE. err.SQLState = UTF16ToString(sqlState) err.NativeError = int(nativeError) } err.ErrorMessage += UTF16ToString(messageText) } return err }
func SQLGetDiagRec(handleType SQLSMALLINT, handle SQLHANDLE, recNumber SQLSMALLINT, sqlState *SQLWCHAR, nativeErrorPtr *SQLINTEGER, messageText *SQLWCHAR, bufferLength SQLSMALLINT, textLengthPtr *SQLSMALLINT) (ret SQLRETURN) { r := C.SQLGetDiagRecW(C.SQLSMALLINT(handleType), C.SQLHANDLE(handle), C.SQLSMALLINT(recNumber), (*C.SQLWCHAR)(unsafe.Pointer(sqlState)), (*C.SQLINTEGER)(nativeErrorPtr), (*C.SQLWCHAR)(unsafe.Pointer(messageText)), C.SQLSMALLINT(bufferLength), (*C.SQLSMALLINT)(textLengthPtr)) return SQLRETURN(r) }