roseon1 Ответов: 1

Ошибка 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.

1 Ответов

Рейтинг:
1

OriginalGriff

Первая ошибка заключается в том, что строка не помещается в столбец, а SQL не любит "выбрасывать данные", если только ему не будет сказано об этом с помощью команды DELETE. Мы не можем исправить это: либо проверить ваши данные на вашем языке презентации, чтобы они соответствовали, либо увеличить столбец и проверить ваши данные в будущем.

Во - вторых, потому что вы передаете строковое значение в числовой столбец, а SQL - правильно-говорит: "это не число" и отказывается иметь с ним дело.

The solution to both problems is the same: validate your data in your presentation language (uses make mistakes!) and pass the validated and converted values to SQL instead of passing everything as a string and hoping that SQL will sort it out. One big advantage of this is that dates get parsed using the users preferred date format into a DateTime value instead of relying on SQL to try and work out what day, month and year 01-02-03 is supposed to represent (and getting it wrong half the time). Remember, SQL has no access to your user and his settings, so if you have a US user, a European user, and a Japanese user typing 01-02-03 in the date box, they mean three different things: 2nd Jan 2003, 1st Feb 2003, and 3rd of Feb 2001. Once that hits the DB, it's very difficult to work out what date the user intended to enter!