public function insertRecord($recArr)
    {
        $this->events()->trigger(__FUNCTION__ . '.pre', $this, array('record', $recArr));
        if ($this->_isNeedGenerateId($recArr))
            $recArr["Id"] = $this->generateId();    // for certain cases, id is generated before insert

        $this->bizRecord->setInputRecord($recArr);

        if (!$this->validateInput())
            return false;

        $db = $this->getDBConnection("WRITE");

        try {
            $sql = $this->getSQLHelper()->buildInsertSQL($this, $joinValues);
            if ($sql) {
                Openbizx::$app->getLog()->log(LOG_DEBUG, "DATAOBJ", "Insert Sql = $sql");
                $db->query($sql, $bindValues);
            }
            //$mainId = $db->lastInsertId();
            if ($this->_isNeedGenerateId($recArr)) {
                $this->m_db = $db; //compatiable for CLI mode and also speed up of it running
                $mainId = $this->generateId(false);
                $recArr["Id"] = $mainId;
            }
            Openbizx::$app->getLog()->log(LOG_DEBUG, "DATAOBJ", "New record Id is " . $recArr["Id"]);
        } catch (Exception $e) {
            Openbizx::$app->getLog()->log(LOG_ERR, "DATAOBJ", "Query Error : " . $e->getMessage());
            $this->errorMessage = $this->getMessage("DATA_ERROR_QUERY") . ": " . $sql . ". " . $e->getMessage();
            throw new Openbizx\Data\Exception($this->errorMessage);
            return null;
        }

        $this->bizRecord->setInputRecord($recArr);

        if ($this->_postUpdateLobFields($recArr) === false) {
            $this->errorMessage = $db->ErrorMsg();
            return false;
        }

        $this->cleanCache();

        $this->recordId = $recArr["Id"];
        $this->currentRecord = null;

        $this->_postInsertRecord($recArr);
        $this->events()->trigger(__FUNCTION__ . '.post', $this, array('record', $recArr));
        return $recArr["Id"];
    }