Qt, SQL, Базы данных, Портфолио

Лучшие записи за 2018 год

Без лишних слов. Вот топ 10 записей 2018 года:

  1. Добавление данных в таблицу QTableWidget. Очистка таблицы
  2. Qt. Динамическое создание виджетов на форме
  3. Подключение к базе данных в Qt
  4. Основы баз данных. ER-модель (сущность-связь)
  5. АС «Складской учет». C++ Builder + MySQL
  6. Получить значения полей выделенной строки QTableView
  7. Отображение данных выборки в виджете QTableView
  8. Значения ячеек выделенных строк QTableView
  9. Контекстное меню в Qt. Popup Menu
  10. Кнопки QMessageBox на русском языке
PostgreSQL, Qt

PostgreSQL: unnest(array)

Моя любимая функция PostgreSQL — unnest (ссылка на документацию)! Она такая простая, но такая классная 😀

Она очень пригодится, если нужно вставить сразу несколько записей за один присест. Допустим, у одной фирмы есть несколько номеров телефонов и,чтобы не перечислять вставку этих данных через запятую, дублируя id фирмы, можно использовать unnest — элегантное решение! Продолжить чтение «PostgreSQL: unnest(array)»

"Нет" выгоранию, О том о сём

«Нет» выгоранию: Небольшой порыв к творчеству

С целью не погрязнуть в рабочей рутине и не утонуть в потоках кода целыми днями решила-таки отойти от экрана и сделать что-то для души. Захотелось чего-то мягкого и пушистого 🙂 На ум пришла идея украсить простую дочкину резинку, чтобы была она более «девичьей» и нарядной. Для этого из картона вырезала круг, а у него из центра — еще один круг. Намотала по периметру ниток двух цветов, завязала и подравняла. Вышел симпатичный помпон! (мануалов по тому, как его делать можно найти больше количество по запросу в поисковике).

Вот такая вот милота вышла!

Microsoft SQL Server, PostgreSQL, SQL

PostgreSQL и MSSQLServer: Ограничение количества отображаемых строк выборки

Вывести первые 100 строк запроса:

select * from table_name
order by id
limit 100
PostgreSQL limit
select * from table_name 
fetch next 100 rows only
PostgreSQL fetch
select * from table_name
order by id
offset 0 rows fetch next 100 rows only
Microsoft SQL Server offset...fetch

Вывести 100 строк выборки, пропустив 20 строк:

select * from table_name
order by id
limit 100 offset 20
PostgreSQL limit...offset
select * from table_name 
offset 20 rows fetch next 100 rows only
PostgreSQL offset...fetch
select * from table_name
order by id
offset 20 rows fetch next 100 rows only
Microsoft SQL Server offset...fetch

Стоит отметить, что для использования предложения OFFSET и FETCH в MSSQLServer требуется ORDER BY. В PostgreSQL — нет. В MS SQL Server использование offset без fetch запрещено. В PostgreSQL — нет.

Для ограничения количества выводимых строк без сдвига для Microsoft SQL Server можно воспользоваться оператором top:

select top 100 *
from table_name
order by id
Microsoft SQL Server top

Документация: PostgreSQL, MSSQLServer (offset…fetch, top).

Microsoft SQL Server, PostgreSQL, Qt, Базы данных

Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQL

Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQLНе во всех СУБД есть возможность настроить Резервное копирование базы данных по расписанию штатными средствами. Например, в Microsoft SQL Server это делается без проблем, а вот в PostgreSQL такой возможности «из коробки» нет.

Но выход есть: создать файл сценария и добавить его исполнение в расписание задач в Windows.

В переменных database, host, port, userName, bin, backupDir будут храниться значения имени базы данных, сервера, порта, имени пользователя БД, путь к bin папке PostgreSQL и директории сохранения резервных копий соответственно.

Пусть значение driver = 0 будет отвечать за PostgreSQL, а 1 — за Microsoft SQL Server.

Определим текст *.bat-файла:

QString batText = "@ECHO OFF \n"
        "SET dmpfile="+database+"-FullBackup-%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2% \n"
        "IF \"%TIME:~0,1%\"==\" \" (SET dmpfile=%dmpfile%-0%TIME:~1,1%) ELSE (SET dmpfile=%dmpfile%-%TIME:~0,2%) \n"
        "SET dmpfile=%dmpfile%-%TIME:~3,2%-%TIME:~6,2%.backup \n"
        "set text = Begin to backup... \n"
        "echo %text% \n";
if (driver==0)
       batText += QString(
           "cd %1\ \n"
           "pg_dump.exe --host %2 --port %3 --username %4 --no-password --format" 
		   "custom --blobs --verbose --file \"%5\\%dmpfile%\" %6")
            .arg(bin, host, port, userName, 
				 backupDir.replace("/", "\\"), database);
 else
       batText += QString("SQLCMD -S %1 -E -Q \"BACKUP DATABASE %2 "
           "TO DISK = '%3/%dmpfile%' "
           "WITH INIT, NOFORMAT, SKIP, NOUNLOAD\"")
                .arg(host, database, backupDir);

Имя файла резервной копии будет иметь при этом подобный вид: DatabaseName-FullBackup-2018-08-07 -11-23-38.backup, то есть имя базы данных, FullBackup + таймстемп.

Далее запишем текст в файл: Продолжить чтение «Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQL»

Microsoft SQL Server, PostgreSQL, Базы данных

Триггер на групповую вставку в таблицу в Microsoft SQL Server

Многие СУБД (например, MySQL, PostgreSQL и т.д.) умеют правильно обрабатывать события по групповой вставке данных в таблицы. Но не все. Например, триггер на групповую вставку в таблицу в Microsoft SQl Server будет отличаться. Рассмотрим примеры запросов:

insert into people
select name, surname, age from portfolio;

Или такой:

insert into people(name, surname, age) values
('John', 'Smith', 12),
('Ann', 'Black', 29),
('Samantha', 'Doeson', 38);

Продолжить чтение «Триггер на групповую вставку в таблицу в Microsoft SQL Server»

Microsoft SQL Server, Qt

QSqlQuery::numRowsAffected(), QSqlQuery::size() и MS SQL Server

Для получения количества обработанных записей запросом (insert, update, delete) в Qt используют функцию numRowsAffected(), а для получения размера выборки — size() объекта QSqlQuery:

QSqlQuery query;
if (!query.exec("delete from people where age < 20")) {
	qDebug() << "error:" << query.lastError()->text();
	return;
}
qDebug() << "rows count" << query.numRowsAffected();
numRowsAffected()
QSqlQuery query;
if (!query.exec("select * from people where age < 35")) {
	qDebug() << "error:" << query.lastError()->text();
	return;
}
qDebug() << "rows count" << query.size();
size()

Но не все СУБД поддерживают эту функцию. Например, SQLite и, о Боже! — Microsoft SQL Server (как не стыдно!). Проверить поддержку данной функции (а заодно и функции QSqlQuery::size()) можно так:

qDebug() << database.driver()->hasFeature(QSqlDriver::QuerySize);

где database — объект подключения к базе данных QSqlDatabase. Если в выводе приложения вы увидите false, то прогноз пессимистичен.

Что делать в этом случае?

Продолжить чтение «QSqlQuery::numRowsAffected(), QSqlQuery::size() и MS SQL Server»

Microsoft SQL Server, Qt, Базы данных

Подключение к базе данных MS SQL Server в Qt

В записи Подключение к базе данных в Qt на примере СУБД PostgreSQL я показала, как произвести подключение к базе данных. С MS SQL Server немного запутанней получается (не привыкать).

MS SQL Server может использовать 2 вида аутентификации: аутентификация windows и аутентификация  SQL Server. Ниже рассмотрим оба способа подключения. Продолжить чтение «Подключение к базе данных MS SQL Server в Qt»

"Нет" выгоранию, Фотография

«Нет» выгоранию: прогулки на свежем воздухе

Иногда для того, чтобы прийти в себя, нужно не много: расслабиться, забыть о суете и просто жить моментом.

Прогулка по лесу дает невероятно большой заряд энергии природы, свежий воздух дает сил, а пение птиц хорошо расслабляет.

Вот небольшой кусочек нашей такой недавней прогулки.

 

Возможно, вам понравится: Time management, или Как все успеть женщине, работающей из дома

Microsoft SQL Server

Microsoft SQL Server: Удалить MS_Description для всех колонок таблиц

Потребовалось мигрировать с PostgreSQL в Microsoft SQL Server. И я, доверчивая душа, воспользовалась программой ESF Migration tool kit. Полную версию покупать не стала — мне же на один раз только надо. А эта чудо-программа добавила в описании ко всем полям всех таблиц описание «TRIAL». Не смертельно, но и неприятно. К тому же все триггеры и функции все равно пришлось самостоятельно писать. Так вот. Программисты — люди ленивые, поэтому написала процедуру, которая сама уберет все описания к полям. Использует она системную процедуру sp_dropextendedproperty:

declare @table nvarchar(100), @column nvarchar(100);
declare cur cursor local scroll
for select A.table_name, A.column_name
from information_schema.columns A
inner join information_schema.tables B 
on(A.table_name = B.table_name)
where A.table_schema = 'dbo' and 
A.table_catalog = 'database_name' and 
--только для таблиц, не трогая представления
B.table_type='base table';

open cur;
fetch first from cur into @table, @column;
while(@@fetch_status = 0) begin
	EXEC sp_dropextendedproperty 'MS_Description', 
		N'schema', N'dbo', N'table', @table, 
		N'column', @column;
    fetch next from cur into @table, @column;
    end;
close cur;
deallocate cur;
END
Курсор для удаления описания к полям таблиц

Пример, приведенный на странице форума MSDN, почему-то не сработал — все описания остались на прежних местах.