Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 ODBC бэкап. Управление возвращается раньше создания файла  [new]
Extro
Member

Откуда:
Сообщений: 11
Здравствуйте.
Имею код виды:

WCHAR* szConnStrOut = <<Здесь моя строка подключения>>
SQLAlloc();
	SQLRETURN ret;
	SQLSMALLINT pcbConnStrOut;

	SQLDriverConnect(m_hDbc, 
		hWnd, 
		(SQLWCHAR*)szConnStr, 
		SQL_NTS, 
		(SQLWCHAR*)szConnStrOut,
		sizeof(szConnStrOut), 
		&pcbConnStrOut, 
		(SQLUSMALLINT)drvConn);


SQLAllocHandle(SQL_HANDLE_STMT, m_hDbc, &m_hStmt);
SQLRETURN ret;
while ((ret=SQLExecDirect(m_hStmt,(SQLWCHAR*)<<Скрипт бэкапа>>,SQL_NTS))==SQL_STILL_EXECUTING) 
{}

SQLDisconnect(m_hDbc);
SQLFree();


Возвращает управление, после выполнения скрипта (SQLExecDirect) и файл не успевает создаваться до выполнения SQLDisconnect. То есть если ставить точку останова или паузу перед SQLDisconnect, то файл бэкапа создается.
Подскажите, пожалуйста, есть ли в ODBC методы, что бы отследить создание файла бэкапа или же придется отслеживать появление файла средствами системы?
28 окт 13, 13:09    [15040751]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Glory
Member

Откуда:
Сообщений: 104751
When an application calls an ODBC function in synchronous mode, the driver does not return control to the application until it is notified that the server has completed the command.
28 окт 13, 13:30    [15040898]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Extro
Member

Откуда:
Сообщений: 11
Glory
When an application calls an ODBC function in synchronous mode, the driver does not return control to the application until it is notified that the server has completed the command.

Ага, читал, спасибо. Но, к сожалению, все происходит так, как я написал. По умолчанию стоит синхронный режим, все равно файл не успевает создаться до выполнения SQLDisconnect.
28 окт 13, 13:41    [15041014]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Glory
Member

Откуда:
Сообщений: 104751
Extro
Но, к сожалению, все происходит так, как я написал.По умолчанию стоит синхронный режим, все равно файл не успевает создаться до выполнения SQLDisconnect.

Так не бывает
28 окт 13, 13:44    [15041032]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Extro
Member

Откуда:
Сообщений: 11
Glory
Extro
Но, к сожалению, все происходит так, как я написал.По умолчанию стоит синхронный режим, все равно файл не успевает создаться до выполнения SQLDisconnect.

Так не бывает

Мммм... записать видео и выложить на Ютьюб?
28 окт 13, 13:49    [15041079]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Glory
Member

Откуда:
Сообщений: 104751
Extro
Мммм... записать видео и выложить на Ютьюб?

Созданный вами код проверяйте лучше
28 окт 13, 13:50    [15041091]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Extro
Member

Откуда:
Сообщений: 11
Glory
Созданный вами код проверяйте лучше

Два дня уже проверяю, разные шаманства с синхронным/асинхронным выполнением пробовал, иначе бы не стал спрашивать.
Кстати, разница в выполнении асинхронно в том, что условие
(ret=SQLExecDirect(m_hStmt,(SQLWCHAR*)szSqlStr,SQL_NTS))==SQL_STILL_EXECUTING

срабатывает, а при синхронном оно сразу false. Но на результат это не влияет. Есть пауза до SQLDisconnect - файлик есть, нету паузы - файла нет.
28 окт 13, 14:01    [15041159]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Glory
Member

Откуда:
Сообщений: 104751
Extro
Есть пауза до SQLDisconnect - файлик есть, нету паузы - файла нет.

Где в вашем коде проверка результата окончания команды, переданной серверу ?
28 окт 13, 14:06    [15041197]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Extro
Member

Откуда:
Сообщений: 11
Glory
Extro
Есть пауза до SQLDisconnect - файлик есть, нету паузы - файла нет.

Где в вашем коде проверка результата окончания команды, переданной серверу ?

Воот, наверное, вы меня сейчас и наставите на путь истный, до вашего вопроса, думал, что это
((ret=SQLExecDirect(m_hStmt,(SQLWCHAR*)<<Скрипт бэкапа>>,SQL_NTS))==SQL_STILL_EXECUTING)
28 окт 13, 14:08    [15041215]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Glory
Member

Откуда:
Сообщений: 104751
Extro
Воот, наверное, вы меня сейчас и наставите на путь истный, до вашего вопроса, думал, что это

Это - запуск.
А где провекра того, что вам вернул сервер ?
28 окт 13, 14:09    [15041221]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Extro
Member

Откуда:
Сообщений: 11
Glory
А где провекра того, что вам вернул сервер ?

Не думал, что сервер что-то должен вернуть, если я его прошу вы полнить "BACKUP DATABASE <<и т.д.>>"?
Как проверить ответ не подскажите?
28 окт 13, 14:14    [15041242]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Glory
Member

Откуда:
Сообщений: 104751
Extro
Не думал, что сервер что-то должен вернуть, если я его прошу вы полнить "BACKUP DATABASE <<и т.д.>>"?

Мда. Может стоить прочитать в хелпе про команду BACKUP ?

Extro
Как проверить ответ не подскажите?

Опять же прочитать в хелпе про Handling Errors and Messages
28 окт 13, 14:17    [15041279]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Extro
Member

Откуда:
Сообщений: 11
Glory
Мда. Может стоить прочитать в хелпе про команду BACKUP ?

Не судите строго, все же имеют столько опыта общения с БД как вы :)
Вычитал, что после выполнения комманды бэкапа в лог скаладывается сообщение с флагом 3226. То есть, после выполнения команды можно в цикле пускать запрос на сообщение в логе, как появится 3226 - значит файл готов. Я на верном пути?
28 окт 13, 15:26    [15041729]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Glory
Member

Откуда:
Сообщений: 104751
Extro
Вычитал, что после выполнения комманды бэкапа в лог скаладывается сообщение с флагом 3226. То есть, после выполнения команды можно в цикле пускать запрос на сообщение в логе, как появится 3226 - значит файл готов. Я на верном пути?

Еще раз - ни надо читать какие то логи или искать файл.
Сервер сообщает вам о завершении команды в любом случае.
28 окт 13, 16:05    [15041947]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Extro
Member

Откуда:
Сообщений: 11
Glory
Еще раз - ни надо читать какие то логи или искать файл.
Сервер сообщает вам о завершении команды в любом случае.

Ну я вот и пытаюсь разобраться, каким образом он должен мне сообщить о завершении команды вернуть, не подскажите?
28 окт 13, 20:06    [15043070]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
Extro
Glory
Еще раз - ни надо читать какие то логи или искать файл.
Сервер сообщает вам о завершении команды в любом случае.

Ну я вот и пытаюсь разобраться, каким образом он должен мне сообщить о завершении команды вернуть, не подскажите?
Тут могут и не знать, как программировать доступ к сиквелу на ODBC+C
Я вот не представляю, как в вашей конструкции получить результат выполнения команды бакапа.

Можно спросить на формуме https://www.sql.ru/forum/cpp
28 окт 13, 20:31    [15043137]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Где обработка ошибок? Что именно возвращает SQLExecDirect?
28 окт 13, 20:36    [15043148]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
У вас вообще код кривой. Вы не ret сравниваете с SQL_STILL_EXECUTING, а результат операции присвоения переменной ret какого-то значения.

Напишите по-человечески:

do {
    ret = SQLExecDirect(m_hStmt,(SQLWCHAR*)<<Скрипт бэкапа>>,SQL_NTS);
} while ( ret == SQL_STILL_EXECUTING );


И выясните таки, что вам возвращает ret:

http://msdn.microsoft.com/en-us/library/ms713611(v=vs.85).aspx
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_STILL_EXECUTING, SQL_ERROR, SQL_NO_DATA, SQL_INVALID_HANDLE, or SQL_PARAM_DATA_AVAILABLE.


Сообщение было отредактировано: 28 окт 13, 20:52
28 окт 13, 20:45    [15043173]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
Гавриленко Сергей Алексеевич
У вас вообще код кривой. Вы не ret сравниваете с SQL_STILL_EXECUTING, а результат операции присвоения переменной ret какого-то значения.
Не, вроде на С так правильно, это стандартный общепринятый стиль, как я смутно помню :-)
while( (i=func()) == 1)
{}
будет в бесконечном цикле вызываться func(), результат присваиваться i, пока результат равен 1
28 окт 13, 20:52    [15043183]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Да, перепутал. Но значение все равно обрабатывать надо.
28 окт 13, 20:57    [15043195]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
Extro
Ну я вот и пытаюсь разобраться, каким образом он должен мне сообщить о завершении команды вернуть, не подскажите?
Вот пример: http://datasql.ru/proektbd/4.htm

ИМХО цикла не требуется, SQLExecDirect инициализирует команду, нужно просто обработать результат.

Но! для завершения нужно далее, после вызова SQLExecDirect, получать результаты командами SQLFetch или чем то подобным.

Ещё посмотрите тут:
http://support.microsoft.com/kb/140696

Бакап возвращает результат как инфо-сообщение, и нужно получать его функцией, хотя это не ошибка. Впрочем, получать ошибки тоже нужно.

Вообще это безумие - программировать бакапы на C через ODBC без создания функции-обёртки.

Сделайте функцию, которая выполняет текст, читает все-все рекордсеты, инфо и error сообщения, обрабатывает все состояния, отладьте её на примере из MS статьи и только потом посылайте команды бакапа.
28 окт 13, 21:03    [15043201]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
alexeyvg
и нужно получать его функцией,
хотел написать:
и нужно получать его функцией SQLError(),
28 окт 13, 21:04    [15043204]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
igas
Member

Откуда: Minsk
Сообщений: 175
Когда Вы используете асинхронный режим драйвера ODBC SQLExecDirect возвращает SQL_STILL_EXECUTING, до окончания выполнения запроса. После успешного выполнения SQLExecDirect вернёт SQL_SUCCESS или SQL_SUCCESS_WITH_INFO если выполнение прошло успешно, или что-то другое. Для получения подробной информации о выполненном запросе используйте SQLGetDiagRec или SQLError.
Также проверьте свой код на наличие таких инструкций, они переводят в драйвера ODBC
SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE, SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE, SQL_ASYNC_ENABLE_ON, SQL_IS_INTEGER);

Может каким-то образом у вас включен по-умолчанию асинхронный режим(!), поэтому используйте такую конструкцию.
SQLSetConnectAttr(hdbc, SQL_ATTR_ASYNC_ENABLE, SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt, SQL_ATTR_ASYNC_ENABLE, SQL_ASYNC_ENABLE_OFF, SQL_IS_INTEGER);


Вот пример работающего кода:
SQLHENV      henv = SQL_NULL_HENV;
SQLHDBC      hdbc = SQL_NULL_HDBC;
SQLHSTMT     hstmt = SQL_NULL_HSTMT;
SQLSMALLINT   pcbConnStrOut = 0;
SQLCHAR * wszConnStr = (SQLCHAR *)"Driver={SQL Server};Server=SQLSERVERHOST;Database=master;Uid=YourUser;Pwd=YourPass;";
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
{
	retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); 
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{
		retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
		if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
		{
			retcode = SQLDriverConnect(hdbc, NULL, wszConnStr, SQL_NTS, NULL, 0, &pcbConnStrOut, SQL_DRIVER_NOPROMPT);
			if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
			{
				retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);   
				if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
				{
					retcode = SQLExecDirect(hstmt, (SQLCHAR*)"BACKUP DATABASE [NameDB] TO DISK = N'C:\\backup.bup' WITH INIT, SKIP;", SQL_NTS);
					if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
						trace("SUCCESSFULLY");
					SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
				}
				SQLDisconnect(hdbc);
			}
			SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
		}
	}
	SQLFreeHandle(SQL_HANDLE_ENV, henv);
28 окт 13, 23:38    [15043615]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
Extro
Member

Откуда:
Сообщений: 11
igas
Вот пример работающего кода:


Спасибо за ответ. К сожалению, код аналогичен моему и работатет так же, то есть если ставить паузу:
igas
				if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
				{
					retcode = SQLExecDirect(hstmt, (SQLCHAR*)"BACKUP DATABASE [NameDB] TO DISK = N'C:\\backup.bup' WITH INIT, SKIP;", SQL_NTS);
					if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
						trace("SUCCESSFULLY"); 
                                        
                                        Sleep(1000);//Вот здесь паузу

					SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
				}
                               
				SQLDisconnect(hdbc);


То файлик создается, инече нет.
retcode возвращает SQL_SUCCESS
29 окт 13, 07:10    [15044104]     Ответить | Цитировать Сообщить модератору
 Re: ODBC бэкап. Управление возвращается раньше создания файла  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31993
Extro
К сожалению, код аналогичен моему и работатет так же
Да просто он так же не читает результат.
В ссылке от MS всё же описано.
29 окт 13, 09:12    [15044420]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить