Перейти к содержимому


Фотография

Проблема с преобразованием при чтении из базы данных


Лучший Ответ Zlobot , 14 October 2016 - 17:50

Проблему решил. Более внимательно поковырялся в ini базы и вставил в OUTPUT запроса на загрузку принудительно стринг. OUTPUT = 1-string,2,3,4,5,6,7 Теперь все нормально)) 

dos622 благодарю за подсказки. Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 14

#1 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 13 October 2016 - 19:00

Создаю запись в таблице MySQL где одно из значений UID игрока. Тип задан varchar(50). В Навикате значения показываются нормально в  17 значном виде типа 12345678901234567. При чтении из базы параметр записывается в переменную привязанную к объекту.

часть кода...

_OwnerID = _data select 0;

_obj setVariable ["Djed_OwnerID",_OwnerID, true];

 

Так вот. При выводе в лог значение _OwnerID показывает как 1.23457e+016. То есть переводит в вещественную запись, да к тому же округляет. Хотя, по идее, данные имеют строковое значение. Пробовал даже принудительно их переводить в стринг 

_OwnerID = str (_data select 0) но и тут засада. В логе пишет тоже самое, но в кавычках: "1.23457e+016".

Потом этот параметр сравнивается с UID игрока, чтобы определить владелец ли он объекта, но сравнение естественно не получается. К тому же еще и Generic error выдает на _ownerID.

Кстати менял varchar на bigint - такая-же лабуда.

Использую extDB3. Может в нем проблема?


  • 0

#2 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 сообщений

Отправлено 13 October 2016 - 20:47


Потом этот параметр сравнивается с UID игрока,

 

а если уид не совпал, он так у тебя будет всю базу данных перебирать?

проще помоему взять уид игрока и найти его в БД, если ненашел создает новый, если нашел, подгружает профиль.

 

extDB3 прекрасная вещь, просто ты не совсем по правильному пути пошел изначально, вот тебе тема, тут на форме, как раз найдешь, то что ты ищешь:


  • 0

#3 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 14 October 2016 - 12:15

Спасибо за ответ. Ту тему я видел, правда не всю просмотрел.)) На счет переборки всей базы, Вы не правильно поняли. Это не профиль создается, это проверка конструкции на владельца. Ну типа Джаммера в епоче. И их не может быть очень много)) Проверяется при запуске сервера и создает конструкцию соответственно. Проблема в преобразовании в вещественную запись, я не могу понять почему это происходит. 


Сообщение отредактировал Zlobot: 14 October 2016 - 12:19

  • 0

#4 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 сообщений

Отправлено 14 October 2016 - 14:05


И их не может быть очень много

у каждого игрока свой, что будет с твоим сервером, когда записей станет тыща?:) не проще ли искать игрока в базе, а не базу в игроке?

 


я не могу понять почему это происходит. 

 

как ты забираешь данные из базы?


  • 0

#5 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 14 October 2016 - 14:49

 


И их не может быть очень много

у каждого игрока свой, что будет с твоим сервером, когда записей станет тыща? :) не проще ли искать игрока в базе, а не базу в игроке?

 

 

 


я не могу понять почему это происходит. 

 

как ты забираешь данные из базы?

 

Вот так: функция загрузки нужного объекта (джед). 

_id = _this select 0; // идентификатор джеда в базе

 
_fetchstr = format ["loadDjed:%1", _id];
_fetch = [_fetchstr, 2] call ExternalS_fnc_ExtDBasync;
 
_data = _fetch select 0;
_OwnerID = _data select 0; // UID хозяина джеда. Вот тут и проблема!
_position = [_data select 1, _data select 2, _data select 3];
_djed = createVehicle ["Djed_Static", _position, [], 0, "CAN_COLLIDE"];
_djed setPosATL _position;
//_djed setVectorDirAndUp [_vectorDirection, _vectorUp];
 
_djed setVariable ["Djed_OwnerID",_OwnerID, true];
 
_djed setVariable ["Energy", _data select 4, true];
_djed setVariable ["Djed_Radius", _data select 5, true];

... дальше там навешивание на него action и возврат созданного объекта.

 

ExternalS_fnc_ExtDBasync - функция обработки запроса,честно слямзил у кого-то))

/*
	File: asyncCall.sqf
	Author: Bryan "Tonic" Boardwine

	Description:
	Commits an asynchronous call to extDB
	Gets result via extDB  4:x + uses 5:x if message is Multi-Part

	Parameters:
		0: STRING (Query to be ran).
		1: INTEGER (1 = ASYNC + not return for update/insert, 2 = ASYNC + return for query's).
*/

private["_queryStmt","_queryResult","_key","_mode","_return","_loop"];

if (!params [["_queryStmt", "", [""]],["_mode", 0, [0]]]) exitWith {};

_key = "extDB3" callExtension format["%1:%2:%3",_mode, (call extDB_SQL_CUSTOM_ID), _queryStmt];
if(_mode isEqualTo 1) exitWith {true};

_key = call compile format["%1",_key];
_key = _key select 1;

//uisleep (random .03);

_queryResult = "";
_loop = true;
while{_loop} do
{
	_queryResult = "extDB3" callExtension format["4:%1", _key];
	if (_queryResult isEqualTo "[5]") then {
		// extDB3 returned that result is Multi-Part Message
		_queryResult = "";
		while{true} do {
			_pipe = "extDB3" callExtension format["5:%1", _key];
			if(_pipe isEqualTo "") exitWith {_loop = false};
			_queryResult = _queryResult + _pipe;
		};
	}
	else
	{
		if (_queryResult isEqualTo "[3]") then
		{
			//diag_log format ["extDB3: uisleep [4]: %1", diag_tickTime];
			//uisleep 0.1;
		} else {
			_loop = false;
		};
	};
};


_queryResult = call compile _queryResult;

// Not needed, its SQF Code incase extDB3 ever returns error message i.e Database Connection Died
if ((_queryResult select 0) isEqualTo 0) exitWith {diag_log format ["extDB3: Protocol Error: %1", _queryResult]; []};
_return = (_queryResult select 1);
_return;

  • 0

#6 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 сообщений

Отправлено 14 October 2016 - 15:10


_fetchstr = format ["loadDjed:%1", _id];

_fetch = [_fetchstr, 2] call ExternalS_fnc_ExtDBasync;

 

  _data = _fetch select 0;

_OwnerID = _data select 0; // UID хозяина джеда. Вот тут и проблема!

 

так попробуй:

 

_Data = call compile format["%1", _fetch];
_OwnerID =(_Data select 0) select 0;
 

  • 0

#7 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 14 October 2016 - 15:36

 


_fetchstr = format ["loadDjed:%1", _id];

_fetch = [_fetchstr, 2] call ExternalS_fnc_ExtDBasync;

 

  _data = _fetch select 0;

_OwnerID = _data select 0; // UID хозяина джеда. Вот тут и проблема!

 

так попробуй:

 

_Data = call compile format["%1", _fetch];
_OwnerID =(_Data select 0) select 0;
 

Не помогло.( Один хрен в логе показывает в вещественной форме с округлением. "Server: LoadDjed - _OwnerID:7.65612e+016" 

Чую, что ответ где-то рядом, но вот куды копать не чую))


  • 0

#8 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 сообщений

Отправлено 14 October 2016 - 16:28

Zlobot,

а в переменной _Data что выдает?

и _fetch тоже интересует


в логе ExtDB что пишет?


Сообщение отредактировал dos622: 14 October 2016 - 16:24

  • 0

#9 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 14 October 2016 - 16:32

Zlobot,

а в переменной _Data что выдает?

и _fetch тоже интересует


в логе ExtDB что пишет?

В моем варианте вот это:

                                             УИД                 x             y            z             

"Server: LoadDjed - _fetch:[[7.65612e+016,8434.77,3101.91,-0.0927715,100,1,1]]"
"Server: LoadDjed - _data:[7.65612e+016,8434.77,3101.91,-0.0927715,100,1,1]"
хм, уже тут преобразование получается.
 В логе ExtDB  пусто, ошибок нет, а подробный лог я не настраивал, не знаю толком как.

Сообщение отредактировал Zlobot: 14 October 2016 - 16:36

  • 0

#10 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 сообщений

Отправлено 14 October 2016 - 16:50

Zlobot, так. а в базе данных данные нормальные? 


  • 0

#11 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 14 October 2016 - 16:54

Zlobot, так. а в базе данных данные нормальные? 

Да, по крайней мере в Навикате показывает нормальный УИД. Все 17 цифр.

Тип в таблице `owner_uid` varchar(50) DEFAULT NULL,


Сообщение отредактировал Zlobot: 14 October 2016 - 16:54

  • 0

#12 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 сообщений

Отправлено 14 October 2016 - 16:56

в ини файле

 

Strip Chars Mode =

у тебя что?

 

по

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

0 = Strip Bad Chars, 1 = Strip + Log Bad Chars, 2 = Return Error & Log Bad Chars

 

еиничку лучше поставить


  • 0

#13 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 14 October 2016 - 17:01

Strip Chars Mode = 1

Может надо = 2? Там написано :

0 = Strip Bad Chars, 1 = Strip + Log Bad Chars, 2 = Return Error & Log Bad Chars  


Сообщение отредактировал Zlobot: 14 October 2016 - 17:02

  • 0

#14 OFFLINE   Zlobot

Zlobot

    Мл.сержант

  • Пользователи
  • 149 сообщений
  • Откуда:Хабаровск

Отправлено 14 October 2016 - 17:50   Лучший Ответ

Проблему решил. Более внимательно поковырялся в ini базы и вставил в OUTPUT запроса на загрузку принудительно стринг. OUTPUT = 1-string,2,3,4,5,6,7 Теперь все нормально)) 

dos622 благодарю за подсказки.
  • 1

#15 OFFLINE   dos622

dos622

    Ст. Прапорщик

  • Пользователи
  • 702 сообщений

Отправлено 14 October 2016 - 21:50

да не за что, ты сам все наел:)

Я вот кстати забыл, про преобразование в строку при выводе, хотя ответ на поверхности был:)


  • 0




Яндекс.Метрика