Не помоглопопробуй в интерте еще name передавать
Так и естьСейчас вот читаю об этом, одни источники пишут, что в MyISAM транзакции не поддерживаются,
Такой вопрос:
Допустим, мне вышеперечисленное сейчас некритично,
зато важно чтобы операция была атомарна со стороны sm,
т.е. на нее не влиял обрыв сетевого подключения.
Если у меня MyISAM и я отправляю транзакцию через SourceMod,
она ведь уходит на удалённый сервер одним пакетом данных
и не начнёт выполняться, пока БД не примет запрос целиком,
даже если тип базы не является Transaction-Safe?
Спасибо за ссылочку. Не обнадеживает :)Он шлет в субд команду начала транзакции, потом запросы, потом коммит
ну значит субд просто проигнорит команды управления транзакцией и будет выполнять все запросы как атомарные.
BEGIN это просто более которкий алиас START TRANSACTIONМожно еще такой нубский вопрос:
Вот везде пишут - чтобы это нормально работало нужно в InnoDB исполнить SET AUTOCOMMIT=0,
тогда запросы не будут модифицировать таблицу мгновенно, (либо начинать запрос со слов START TRANSACTION).
Но sm юзает "BEGIN", следовательно о SET AUTOCOMMIT=0 мне нужно явно позаботится самому.
Но, что будет если этого не сделать? Т.е., если у меня SET AUTOCOMMIT=1 и я делаю запрос с автокоммитом,
я его уже не смогу отменить через команду ROLLBACK ?
public void ConnectMap_DB()
{
char szQuery[256], szName[MAX_NAME_LENGTH*2+1], szBuff[128];
GetCurrentMap(szBuff, sizeof(szBuff));
g_hDatabase.Escape(szBuff, szName, sizeof(szName)); <-- тут ошибка.
FormatEx(szQuery, sizeof(szQuery), "SELECT `game`, `maxplayers` FROM `mn_map` WHERE `namemap` = '%s';", szName);
g_hDatabase.Query(SQL_ConnectMap, szQuery);
}
Ты при коннекте передал хендел бд?Помогите пожалуйста!
Не пойму в чем проблема.
Сама ошибка:C++:public void ConnectMap_DB() { char szQuery[256], szName[MAX_NAME_LENGTH*2+1], szBuff[128]; GetCurrentMap(szBuff, sizeof(szBuff)); g_hDatabase.Escape(szBuff, szName, sizeof(szName)); <-- тут ошибка. FormatEx(szQuery, sizeof(szQuery), "SELECT `game`, `maxplayers` FROM `mn_map` WHERE `namemap` = '%s';", szName); g_hDatabase.Query(SQL_ConnectMap, szQuery); }
[SM] Exception reported: Invalid database Handle 0 (error: 4)
код полный скиньПомогите пожалуйста!
Не пойму в чем проблема.
Сама ошибка:C++:public void ConnectMap_DB() { char szQuery[256], szName[MAX_NAME_LENGTH*2+1], szBuff[128]; GetCurrentMap(szBuff, sizeof(szBuff)); g_hDatabase.Escape(szBuff, szName, sizeof(szName)); <-- тут ошибка. FormatEx(szQuery, sizeof(szQuery), "SELECT `game`, `maxplayers` FROM `mn_map` WHERE `namemap` = '%s';", szName); g_hDatabase.Query(SQL_ConnectMap, szQuery); }
[SM] Exception reported: Invalid database Handle 0 (error: 4)
Database g_hDatabase;
public void OnPluginStart()
{
Database.Connect(ConnectCallBack, "mnsystem");
}
public void ConnectCallBack(Database hDatabase, const char[] sError, any data)
{
if (hDatabase == null)
{
SetFailState("Database failure: %s", sError);
return;
}
g_hDatabase = hDatabase;
SQL_LockDatabase(g_hDatabase);
g_hDatabase.Query(SQL_CheckError, "CREATE TABLE IF NOT EXISTS `mn_map` (\
`namemap` VARCHAR(32) NOT NULL,\
`game` INTEGER NOT NULL default '0',\
`maxplayers` INTEGER NOT NULL default '0');");
SQL_UnlockDatabase(g_hDatabase);
g_hDatabase.SetCharset("utf8");
}
public void OnMapStart()
{
ConnectMap_DB();
}
public void SQL_ConnectMap(Database hDatabase, DBResultSet hResults, const char[] sError, any data)
{
if(sError[0])
{
LogError("SQL_ConnectMap: %s", sError);
return;
}
if(hResults.FetchRow())
{
g_iGameMap = hResults.FetchInt(0);
g_iMxPl = hResults.FetchInt(1);
}
else
{
char szQuery[256], szName[128];
g_hDatabase.Escape(szMap, szName, sizeof(szName));
FormatEx(szQuery, sizeof(szQuery), "INSERT INTO `mn_map` (`namemap`) VALUES ( '%s');", szName);
g_hDatabase.Query(SQL_CreateMap, szQuery);
}
}
ConnectMap_DB() явно не в OnMapStart нужно вызывать. За это время подключение еще может не состояться.C++:Database g_hDatabase; public void OnPluginStart() { Database.Connect(ConnectCallBack, "mnsystem"); } public void ConnectCallBack(Database hDatabase, const char[] sError, any data) { if (hDatabase == null) { SetFailState("Database failure: %s", sError); return; } g_hDatabase = hDatabase; SQL_LockDatabase(g_hDatabase); g_hDatabase.Query(SQL_CheckError, "CREATE TABLE IF NOT EXISTS `mn_map` (\ `namemap` VARCHAR(32) NOT NULL,\ `game` INTEGER NOT NULL default '0',\ `maxplayers` INTEGER NOT NULL default '0');"); SQL_UnlockDatabase(g_hDatabase); g_hDatabase.SetCharset("utf8"); } public void OnMapStart() { ConnectMap_DB(); } public void SQL_ConnectMap(Database hDatabase, DBResultSet hResults, const char[] sError, any data) { if(sError[0]) { LogError("SQL_ConnectMap: %s", sError); return; } if(hResults.FetchRow()) { g_iGameMap = hResults.FetchInt(0); g_iMxPl = hResults.FetchInt(1); } else { char szQuery[256], szName[128]; g_hDatabase.Escape(szMap, szName, sizeof(szName)); FormatEx(szQuery, sizeof(szQuery), "INSERT INTO `mn_map` (`namemap`) VALUES ( '%s');", szName); g_hDatabase.Query(SQL_CreateMap, szQuery); } }
а можно пример таблиц и запросов?Подскажите, как эффективно выполнить около 100 отдельных запросов?
Справится ли SM с такой транзакцией? Или лучше разбить на несколько...
Может, кто проводил подобные опыты.
Скажем, мне нужно получить поля № 2 (версия), по полям № 1, имена у которых абсолютно разные (это будет название квара).
#define DATABASE_CREATE_TABLE "\
CREATE TABLE IF NOT EXISTS `"...DATABASE_TABLE..."` (\
`cvar` TINYTEXT NOT NULL,\
`ver` TINYTEXT NOT NULL,\
`url` TINYTEXT NOT NULL,\
`name` TINYTEXT NOT NULL,\
`time` int(11) NOT NULL DEFAULT '0',\
PRIMARY KEY (cvar(64))\
) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
FormatEx(g_sQuery1, sizeof(g_sQuery1)
, "SELECT \
cvar, \
ver \
FROM `"...DATABASE_TABLE..."` WHERE `cvar` = '%s'", cvar);
g_hDB.Query(SQL_Callback_Update, g_sQuery1);