Ошибка SQL exec для:: обновление чар:кодом sqlstate tiburoncin:22001, [Microsoft][драйвер ODBC для SQL-сервера][SQL сервер]строка или двоичные данные могут быть усечены.
<pre>bool GS_CThreadSQL::UpdateUserRECORD (classUSER *pUSER) { // update character DB !!! // "UPDATE tblGS_AVATAR SET nZoneNO=xxx, binBasicI=xx, binBasicA=xx WHERE txtNAME=xxx;" m_sBE.m_btCharRACE = (BYTE)pUSER->m_nCharRACE; if ( pUSER->Get_HP() <= 0 ) { // Á¸¹øÈ£°¡ ¾øÀ¸¸é ??? // Á×¾úÀ¸¸é ÀúÀåµÈ ºÎÈ°Àå¼Ò¿¡¼ ... if ( pUSER->m_nZoneNO == BEGINNER_ZONE_NO ) { m_sBE.m_nZoneNO = BEGINNER_ZONE_NO; m_sBE.m_PosSTART = pUSER->m_PosCUR; } else { m_sBE.m_nZoneNO = pUSER->m_nReviveZoneNO; m_sBE.m_PosSTART = pUSER->m_PosREVIVE; } } else { m_sBE.m_nZoneNO = pUSER->m_nZoneNO; m_sBE.m_PosSTART = pUSER->m_PosCUR; } // ºÎÈ° Àå¼Ò... m_sBE.m_nReviveZoneNO = pUSER->m_nReviveZoneNO; m_sBE.m_PosREVIVE = pUSER->m_PosREVIVE; m_sBE.m_btCharSlotNO = pUSER->m_btPlatinumCHAR; if ( m_sBE.m_nZoneNO < 0 || m_sBE.m_nReviveZoneNO < 0 ) { g_LOG.CS_ODS( 0xffff, "**** Invalid ZoneNO [ %s ] Race: %d, Zone: %d ReviveZone: %d \n", pUSER->Get_NAME(), m_sBE.m_btCharRACE, m_sBE.m_nZoneNO, m_sBE.m_nReviveZoneNO ); } ::CopyMemory( m_sBE.m_PartITEM, pUSER->m_PartITEM, sizeof(tagPartITEM)*MAX_BODY_PART); ::CopyMemory( m_sBE.m_RideITEM, pUSER->m_RideITEM, sizeof(tagPartITEM)*MAX_RIDING_PART); pUSER->m_BasicINFO.m_cFaceIDX = (char)pUSER->m_PartITEM[ BODY_PART_FACE ].m_nItemNo; pUSER->m_BasicINFO.m_cHairIDX = (char)pUSER->m_PartITEM[ BODY_PART_HAIR ].m_nItemNo; this->m_pSQL->BindPARAM( 1, (BYTE*)&this->m_sBE, sizeof( tagBasicETC ) ); this->m_pSQL->BindPARAM( 2, (BYTE*)&pUSER->m_BasicINFO, sizeof( tagBasicINFO ) ); this->m_pSQL->BindPARAM( 3, (BYTE*)&pUSER->m_BasicAbility, sizeof( tagBasicAbility ) ); this->m_pSQL->BindPARAM( 4, (BYTE*)&pUSER->m_GrowAbility, sizeof( tagGrowAbility ) ); this->m_pSQL->BindPARAM( 5, (BYTE*)&pUSER->m_Skills, sizeof( tagSkillAbility ) ); this->m_pSQL->BindPARAM( 6, (BYTE*)&pUSER->m_Inventory, sizeof( CInventory ) ); this->m_pSQL->BindPARAM( 7, (BYTE*)&pUSER->m_Quests, sizeof( tagQuestData ) ); this->m_pSQL->BindPARAM( 8, (BYTE*)&pUSER->m_HotICONS, sizeof( CHotICONS ) ); this->m_pSQL->BindPARAM( 9, (BYTE*)&pUSER->m_WishLIST, sizeof( tagWishLIST ) ); #ifdef __KCHS_BATTLECART__ // MQ_PARAM_INT16, DATA_VER_2, this->m_pSQL->MakeQuery( "UPDATE tblGS_AVATAR SET binBasicE=", MQ_PARAM_BINDIDX, 1, MQ_PARAM_ADDSTR, ",binBasicI=", MQ_PARAM_BINDIDX, 2, MQ_PARAM_ADDSTR, ",binBasicA=", MQ_PARAM_BINDIDX, 3, MQ_PARAM_ADDSTR, ",binGrowA=", MQ_PARAM_BINDIDX, 4, MQ_PARAM_ADDSTR, ",binSkillA=", MQ_PARAM_BINDIDX, 5, MQ_PARAM_ADDSTR, ",blobINV=", MQ_PARAM_BINDIDX, 6, MQ_PARAM_ADDSTR, ",blobQUEST=", MQ_PARAM_BINDIDX, 7, MQ_PARAM_ADDSTR, ",binHotICON=", MQ_PARAM_BINDIDX, 8, MQ_PARAM_ADDSTR, ",binWishLIST=", MQ_PARAM_BINDIDX, 9, MQ_PARAM_ADDSTR, ",btLEVEL=", MQ_PARAM_INT, pUSER->m_GrowAbility.m_nLevel, MQ_PARAM_ADDSTR, ",intMoney=", MQ_PARAM_INT64, pUSER->GetCur_MONEY(), MQ_PARAM_ADDSTR, ",intJOB=", MQ_PARAM_INT, pUSER->m_BasicINFO.m_nClass, MQ_PARAM_ADDSTR, ",dwRegTIME=", MQ_PARAM_INT, this->m_dwCurTIME, MQ_PARAM_ADDSTR, ",dwPartyIDX=", MQ_PARAM_INT, pUSER->GetPARTY() ? pUSER->m_pPartyBUFF->m_wPartyWSID : 0, MQ_PARAM_ADDSTR, ",dwItemSN=", MQ_PARAM_INT, pUSER->m_dwItemSN, MQ_PARAM_ADDSTR, ",intDataVER=", MQ_PARAM_INT16, DATA_VER_2, MQ_PARAM_ADDSTR, "WHERE txtNAME=", MQ_PARAM_STR, pUSER->Get_NAME(), MQ_PARAM_END ); #else this->m_pSQL->MakeQuery( "UPDATE tblGS_AVATAR SET binBasicE=", MQ_PARAM_BINDIDX, 1, MQ_PARAM_ADDSTR, ",binBasicI=", MQ_PARAM_BINDIDX, 2, MQ_PARAM_ADDSTR, ",binBasicA=", MQ_PARAM_BINDIDX, 3, MQ_PARAM_ADDSTR, ",binGrowA=", MQ_PARAM_BINDIDX, 4, MQ_PARAM_ADDSTR, ",binSkillA=", MQ_PARAM_BINDIDX, 5, MQ_PARAM_ADDSTR, ",blobINV=", MQ_PARAM_BINDIDX, 6, MQ_PARAM_ADDSTR, ",blobQUEST=", MQ_PARAM_BINDIDX, 7, MQ_PARAM_ADDSTR, ",binHotICON=", MQ_PARAM_BINDIDX, 8, MQ_PARAM_ADDSTR, ",binWishLIST=", MQ_PARAM_BINDIDX, 9, MQ_PARAM_ADDSTR, ",btLEVEL=", MQ_PARAM_INT, pUSER->m_GrowAbility.m_nLevel, MQ_PARAM_ADDSTR, ",intMoney=", MQ_PARAM_INT64, pUSER->GetCur_MONEY(), MQ_PARAM_ADDSTR, ",intJOB=", MQ_PARAM_INT, pUSER->m_BasicINFO.m_nClass, MQ_PARAM_ADDSTR, ",dwRegTIME=", MQ_PARAM_INT, this->m_dwCurTIME, MQ_PARAM_ADDSTR, ",dwPartyIDX=", MQ_PARAM_INT, pUSER->GetPARTY() ? pUSER->m_pPartyBUFF->m_wPartyWSID : 0, MQ_PARAM_ADDSTR, ",dwItemSN=", MQ_PARAM_INT, pUSER->m_dwItemSN, MQ_PARAM_ADDSTR, "WHERE txtNAME=", MQ_PARAM_STR, pUSER->Get_RNAME(), MQ_PARAM_END ); #endif if ( this->m_pSQL->ExecSQLBuffer() < 0 ) { // °íÄ¡±â ½ÇÆÐ !!! // log ... g_LOG.CS_ODS(LOG_NORMAL, "SQL Exec ERROR:: UPDATE Char:%s %s \n", pUSER->Get_NAME(), m_pSQL->GetERROR() ); } else { // Äɸ¯ ¹é¾÷µÈ ½Ã°£ ·Î±× ³²±â±â.. g_pThreadLOG->When_BackUP( pUSER, "CHAR" ); } if ( BANK_CHANGED != pUSER->m_btBankData ) return true; // â°í(ÀºÇà) µ¥ÀÌŸ ±â·Ï... this->m_pSQL->BindPARAM( 1, (BYTE*)&pUSER->m_Bank, sizeof( tagBankData ) ); this->m_pSQL->MakeQuery( "UPDATE tblGS_BANK SET blobITEMS=", MQ_PARAM_BINDIDX, 1, MQ_PARAM_ADDSTR, "WHERE txtACCOUNT=", MQ_PARAM_STR, pUSER->Get_ACCOUNT(), MQ_PARAM_END ); if ( this->m_pSQL->ExecSQLBuffer() < 0 ) { // °íÄ¡±â ½ÇÆÐ !!! // log ... g_LOG.CS_ODS(LOG_NORMAL, "SQL Exec ERROR:: UPDATE Bank:%s %s \n", pUSER->Get_ACCOUNT(), m_pSQL->GetERROR() ); } else { pUSER->m_btBankData = BANK_LOADED; // â°í ¹é¾÷µÈ ½Ã°£ ·Î±× ³²±â±â.. g_pThreadLOG->When_BackUP( pUSER, "BANK" ); } return true; }
База данных SQL MSSQL 2008 r2
intCharID int Unchecked txtACCOUNT nvarchar(20) Unchecked txtNAME nvarchar(30) Unchecked btLEVEL int Checked intMoney bigint Checked dwRIGHT int Checked binBasicE binary(96) Checked binBasicI binary(32) Unchecked binBasicA binary(48) Unchecked binGrowA binary(384) Unchecked binSkillA binary(384) Unchecked blobQUEST binary(1024) Checked blobINV binary(2048) Unchecked binHotICON binary(96) Checked dwDelTIME int Checked binWishLIST binary(256) Checked dwOPTION int Checked intJOB smallint Unchecked dwRegTIME int Unchecked dwPartyIDX int Checked dwItemSN int Checked intDataVER smallint Unchecked txtCharName nvarchar(30) Checked binSkillB binary(240) Checked Unchecked
Что я уже пробовал:
я пытался понять, почему у меня постоянно возникают проблемы в течение нескольких дней, и, кажется, не могу понять, кто может помочь в этом, пожалуйста, и спасибо
Garth J Lancaster
iirc, эта проблема обычно возникает, потому что у вас есть поле таблицы базы данных, определенное как, например, nvarchar(30), например, ваше txtCharName, но у вас есть строка c++, которая больше 30 символов - скажем, 35 просто в качестве примера. Так что вы получаете сообщение об ошибке, что "Loremipsumdolorsitamet,Миннеаполис" будет усе уйду...consect' на конце, но отсутствует полный 'Миннеаполис'
Есть ли в этом смысл ?
Вы используете "нечетный", т. е. другой слой базы данных, чем я привык, поэтому предложения по исправлению я могу дать только приблизительные мысли .. убедитесь, что ваши размеры параметров обновления соответствуют размерам полей таблицы для типов binary/blobs &string (nvarchar) .. и/или увеличьте типы nvarchar
roseon1
спасибо за эту помощь и теперь у меня возникли проблемы с получением этого я пытался извлечь ошибку SQL запроса к этому но я не могу понять правильную настройку
SQLSTATE:42000, диагностическая информация:[Microsoft][драйвер ODBC SQL Server][SQL Server]ошибка преобразования типа данных varchar в bigint.