- Регистрация
- 23.07.2020
- Сообщения
- 243
- Благодарностей
- 76
- Баллы
- 28
Postgresql 14, подключение Odbc.
Я разленился и не стал писать на C# обновление даты на уровне шаблона, и соответственно нашел в сети такой вот триггер, что переставлять дату на уровне базы. Т.е. взял строку, Postgresql сам вставил дату последнего изменения строки. А при получении строки я просто ORDER BY делаю и должно работать.
Использую метод ZennoPoster.Db.ExecuteQuery изначально который есть ZP.
Грубо говорят ZennoPoster.Db.ExecuteQuery порождает соединения с БД для каждого запроса. В процесс исполнения шаблона делает много запросов в БД и я выхожу по ошибке:
Потому что вернулась пустая строка и я не могу ее сплитануть на части через сепаратор.
Соответственно вопрос: Строка пустая вернулась, потому что ZP не смог поднять соединение, или потому что триггер не успел проставить дату и я в версионности попал в какую-нибудь блокировку и т.д.
Соответственно, как бы вернуть ошибку не произошло соединение или что-то подобнее.
Или как создать соединение и тащить соединение между кубиками?
Я разленился и не стал писать на C# обновление даты на уровне шаблона, и соответственно нашел в сети такой вот триггер, что переставлять дату на уровне базы. Т.е. взял строку, Postgresql сам вставил дату последнего изменения строки. А при получении строки я просто ORDER BY делаю и должно работать.
SQL:
--- Триггер обновления даты и функция ее дергающая
BEGIN;
CREATE OR REPLACE FUNCTION update_proxy_last_work()
RETURNS TRIGGER AS $$
BEGIN
NEW.last_work = now();
RETURN NEW;
END;
$$ language 'plpgsql';
COMMIT;
-- фукнция которая дергает триггер
CREATE TRIGGER update_timestamp_proxy_last_work BEFORE INSERT OR UPDATE ON proxy
FOR EACH ROW EXECUTE PROCEDURE update_proxy_last_work();
Грубо говорят ZennoPoster.Db.ExecuteQuery порождает соединения с БД для каждого запроса. В процесс исполнения шаблона делает много запросов в БД и я выхожу по ошибке:
C#:
throw new Exception("Не смог взять прокси");
C#:
lock(Locker.proxyDB) {
string str_roxy = ZennoPoster.Db.ExecuteQuery(
@"SELECT id, proxy, reboot FROM proxy WHERE active = TRUE AND work = 'Свободен' ORDER BY last_work LIMIT 1;",
null,
ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc,
project.Variables["conn_db"].Value,
"|",
"#"
);
project.SendInfoToLog(str_roxy);
// Проверяем есть ли прокси в наличии
if(str_roxy.Length == 0) {
// Прокси нет в наличии
project.SendToLog("Не смог взять прокси", ZennoLab.InterfacesLibrary.Enums.Log.LogType.Info, true, ZennoLab.InterfacesLibrary.Enums.Log.LogColor.Blue);
throw new Exception("Не смог взять прокси");
} else {
// Прокси есть
project.Variables["id_proxy"].Value = str_roxy.Split('|')[0];
project.Variables["proxy"].Value = str_roxy.Split('|')[1];
project.Variables["proxy_reboot"].Value = str_roxy.Split('|')[2];
string insertDbSql = String.Format(@"UPDATE proxy SET work = 'Работаю' WHERE ""id"" = {0}", project.Variables["id_proxy"].Value);
var ins = ZennoPoster.Db.ExecuteNonQuery( insertDbSql , null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc, project.Variables["conn_db"].Value);
}
}
Соответственно, как бы вернуть ошибку не произошло соединение или что-то подобнее.
Или как создать соединение и тащить соединение между кубиками?