Ошибка при попытке получить схему на ADO (C++)
От: ariets  
Дата: 30.10.08 10:27
Оценка:
Привет всем.
У меня есть следующая задача: проверить, что есть некоторая база MS SQLSERVER на компе (и наличие в ней определенных таблиц). Происходит проверка во время сетапа продукта, когда еще нет нативного клиента MS SQLSERVER, поэтому используется ADO с драйвером sqloledb. Устанавливается соединение, но при попытке выполнить скрипт или получить схему происходит ошибка 800A0E78 (Operation is not allowed when the object is closed, как я понял).
Далее приведен кусочек "тестового" кода с получением Primary Keys. Что я делаю неправильно?
Заранее спасибо=)

void main(void)
{
   CoInitialize(NULL);
   try 
   {

        wchar_t * username = L"Username@Domain"
        wchar_t * password = L"Pass";

        CHandle userToken;
        if (!LogonUser(username, NULL, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &userToken.m_h))
        {
            DWORD err = GetLastError();        
            throw err;
        }
    
        if (!ImpersonateLoggedOnUser(userToken))
        {
            DWORD err = GetLastError();        
            throw err;
        }

        ADODB::_RecordsetPtr   pRs;
        ADODB::_ConnectionPtr  pCn;

        HRESULT hr;

       _variant_t varCriteria[3];

       _bstr_t  mydatabase("monitor");
       _bstr_t  mydbo("dbo");
       _bstr_t  mytable("Alarms");     

       varCriteria[0] = mydatabase;
       varCriteria[1] = mydbo;
       varCriteria[2] = mytable;
    
       VARIANT varData;
       SAFEARRAY FAR* psa;
       SAFEARRAYBOUND rgsabound[1];
       rgsabound[0].lLbound = 0;
       rgsabound[0].cElements = 3;
       psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
   
       for( long lIndex = 0 ; lIndex < 3 ;lIndex++)
       {
          hr  = SafeArrayPutElement(psa, &lIndex, &varCriteria[lIndex]);
       }     
       varData.vt = VT_VARIANT | VT_ARRAY;
       V_ARRAY(&varData) = psa;

       pCn.CreateInstance(__uuidof(ADODB::Connection));

       pCn->Open(L"Provider=sqloledb;Data Source=prog\sqlexpress;Initial Catalog=monitor;Integrated Security='SSPI'",  L"", L"", -1L);                     

       hr = pCn->OpenSchema(ADODB::adSchemaPrimaryKeys, varData, vtMissing,  &pRs);      
      
       if(FAILED(hr))       
          _com_issue_error(hr);  //выполняется  этот код

          .......................
          .......................

   }
   catch //bla-bla
   { 
          // Сюда приходит _com_error с кодом ошибки 800A0E78 
   }
}
Re: Ошибка при попытке получить схему на ADO (C++)
От: vmpire Россия  
Дата: 30.10.08 10:52
Оценка:
Здравствуйте, ariets, Вы писали:

1. Какой код возврата возвращает pCn->Open()?
2. Попробуйте заменить Integrated Security='SSPI' на Integrated Security=SSPI (кавычки тут не нужны)
Re[2]: Ошибка при попытке получить схему на ADO (C++)
От: ariets  
Дата: 30.10.08 12:02
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Здравствуйте, ariets, Вы писали:


V>1. Какой код возврата возвращает pCn->Open()?

V>2. Попробуйте заменить Integrated Security='SSPI' на Integrated Security=SSPI (кавычки тут не нужны)

1. Да. Действительно...Ошибка была еще в вызове Open. Заменил на

hr = pCn->Open(_bstr_t(L"Provider='sqloledb';Integrated Security='SSPI';Data Source='prog\\sqlexpress'"), _bstr_t(L""), _bstr_t(L""), DODB::adConnectUnspecified);

(добавил _bstr_t) Заработало.
2.Одинарные кавычки никак не повлияли ( то есть, как я понял, можно и с ними, можно и без них ).

Спасибо за наводку.
У меня еще один вопросик ( я с БД знаком не очень хорошо ). Имея коннект к базе ( _ConnectionPtr ), как узнать, есть ли в ней таблица с определенным именем? Максимально быстрым способом=)
Re[3]: Ошибка при попытке получить схему на ADO (C++)
От: vmpire Россия  
Дата: 30.10.08 12:17
Оценка:
Здравствуйте, ariets, Вы писали:

A>Здравствуйте, vmpire, Вы писали:


V>>Здравствуйте, ariets, Вы писали:


V>>1. Какой код возврата возвращает pCn->Open()?

V>>2. Попробуйте заменить Integrated Security='SSPI' на Integrated Security=SSPI (кавычки тут не нужны)

A> 1. Да. Действительно...Ошибка была еще в вызове Open. Заменил на


A>
A>hr = pCn->Open(_bstr_t(L"Provider='sqloledb';Integrated Security='SSPI';Data Source='prog\\sqlexpress'"), _bstr_t(L""), _bstr_t(L""), DODB::adConnectUnspecified);   
A>

A> (добавил _bstr_t) Заработало.
A> 2.Одинарные кавычки никак не повлияли ( то есть, как я понял, можно и с ними, можно и без них ).

A> Спасибо за наводку.

A> У меня еще один вопросик ( я с БД знаком не очень хорошо ). Имея коннект к базе ( _ConnectionPtr ), как узнать, есть ли в ней таблица с определенным именем? Максимально быстрым способом=)

Запросом.

select * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'xxx'


или

select * from sys.tables WHERE [name] = 'xxx'


Возможны и другие варианты
Re: Ошибка при попытке получить схему на ADO (C++)
От: pkarklin  
Дата: 30.10.08 13:06
Оценка:
Здравствуйте, ariets, Вы писали:

A>Привет всем.

A>У меня есть следующая задача: проверить, что есть некоторая база MS SQLSERVER на компе (и наличие в ней определенных таблиц). Происходит проверка во время сетапа продукта, когда еще нет нативного клиента MS SQLSERVER, поэтому используется ADO с драйвером sqloledb. Устанавливается соединение, но при попытке выполнить скрипт или получить схему происходит ошибка 800A0E78 (Operation is not allowed when the object is closed, как я понял).
A>Далее приведен кусочек "тестового" кода с получением Primary Keys. Что я делаю неправильно?

Что делаете неправильно:

1. Считаете, что "еще нет нативного клиента MS SQLSERVER", когда " используется ADO с драйвером sqloledb".
2. Зачем то пытаетесь проверять "что есть некоторая база MS SQLSERVER на компе (и наличие в ней определенных таблиц)." клиентским приложением с использованием ADO, хотя это необходимо делать в скрипте на T-SQL.
Re[2]: Ошибка при попытке получить схему на ADO (C++)
От: vmpire Россия  
Дата: 30.10.08 13:17
Оценка:
Здравствуйте, pkarklin, Вы писали:

P>1. Считаете, что "еще нет нативного клиента MS SQLSERVER", когда " используется ADO с драйвером sqloledb".

Драйвер sqloledb содержится в MDAC, а не в native client, всё правильно.


P>2. Зачем то пытаетесь проверять "что есть некоторая база MS SQLSERVER на компе (и наличие в ней определенных таблиц)." клиентским приложением с использованием ADO, хотя это необходимо делать в скрипте на T-SQL.

Почему это "необходимо"? Чем плохо через ADO?
Re[4]: Ошибка при попытке получить схему на ADO (C++)
От: ariets  
Дата: 30.10.08 13:23
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Здравствуйте, ariets, Вы писали:


A>>Здравствуйте, vmpire, Вы писали:


V>>>Здравствуйте, ariets, Вы писали:


V>>>1. Какой код возврата возвращает pCn->Open()?

V>>>2. Попробуйте заменить Integrated Security='SSPI' на Integrated Security=SSPI (кавычки тут не нужны)

A>> 1. Да. Действительно...Ошибка была еще в вызове Open. Заменил на


A>>
A>>hr = pCn->Open(_bstr_t(L"Provider='sqloledb';Integrated Security='SSPI';Data Source='prog\\sqlexpress'"), _bstr_t(L""), _bstr_t(L""), DODB::adConnectUnspecified);   
A>>

A>> (добавил _bstr_t) Заработало.
A>> 2.Одинарные кавычки никак не повлияли ( то есть, как я понял, можно и с ними, можно и без них ).

A>> Спасибо за наводку.

A>> У меня еще один вопросик ( я с БД знаком не очень хорошо ). Имея коннект к базе ( _ConnectionPtr ), как узнать, есть ли в ней таблица с определенным именем? Максимально быстрым способом=)

V>Запросом.


V>
V>select * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'xxx'
V>


V>или


V>
V>select * from sys.tables WHERE [name] = 'xxx'
V>


V>Возможны и другие варианты


Все работает. Еще раз спасибо
Re[3]: Ошибка при попытке получить схему на ADO (C++)
От: pkarklin  
Дата: 30.10.08 13:28
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Драйвер sqloledb содержится в MDAC, а не в native client, всё правильно.


Возможно я не правльно трактовал "нативный", как родной, а не как "транслит" с "Native"

V>Почему это "необходимо"? Чем плохо через ADO?


А Вы посмотрите в каком виде идут инсталляционные скрипты из самого дистрибутива MS SQL, и, гараздо проще, вместо того, чтобы писать свою программу, получая при этом кучу ошибок на ровном месте, использовать любой "генератор инсталляшек", который может запускать внешнее приложение (osql.exe\sqlcmd.exe) с необходимыми параметрами.
Re[4]: Ошибка при попытке получить схему на ADO (C++)
От: vmpire Россия  
Дата: 30.10.08 13:44
Оценка:
Здравствуйте, pkarklin, Вы писали:

V>>Почему это "необходимо"? Чем плохо через ADO?


P>А Вы посмотрите в каком виде идут инсталляционные скрипты из самого дистрибутива MS SQL, и, гараздо проще, вместо того, чтобы писать свою программу, получая при этом кучу ошибок на ровном месте, использовать любой "генератор инсталляшек", который может запускать внешнее приложение (osql.exe\sqlcmd.exe) с необходимыми параметрами.


Исли Вы имеете в виду такие вещи, как проверка таблиц, их апдейт и тому подобные вещи, то да, их удобнее писать прямо на SQL.
Но вот запускать эти скрипты удобнее-таки через ADO, чем через внешнее приложение.

Тут такие проблемы могут быть:
— "внешнее приложение" поставлять с инсталлятором? Это возможное нарушение лицензионного соглашения. А ADO, на машине уже есть почти всегда (если это не старые windows).
— Обрабатывать всевозможные ошибки при вызове этого приложения будет не проще, чем через ADO у которого, фактически, единственная возможная yf ghfrnbrt ошибка — не открытый connection.
— Имперсонация пользователя: как Вы это сделаете через sqlcmd? Далеко не всякий "генератор инсталляшек" это умеет.

Я как раз недавно сталкивался с такими проблемами, так как именно писал инсталлятор
Кстати, совет автору топика: отдельно проверять работу на 64-битном SQL Server. Тут возможны нюансы.
Re[5]: Ошибка при попытке получить схему на ADO (C++)
От: ariets  
Дата: 30.10.08 14:00
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Здравствуйте, pkarklin, Вы писали:


V>>>Почему это "необходимо"? Чем плохо через ADO?


P>>А Вы посмотрите в каком виде идут инсталляционные скрипты из самого дистрибутива MS SQL, и, гараздо проще, вместо того, чтобы писать свою программу, получая при этом кучу ошибок на ровном месте, использовать любой "генератор инсталляшек", который может запускать внешнее приложение (osql.exe\sqlcmd.exe) с необходимыми параметрами.


V>Исли Вы имеете в виду такие вещи, как проверка таблиц, их апдейт и тому подобные вещи, то да, их удобнее писать прямо на SQL.

V>Но вот запускать эти скрипты удобнее-таки через ADO, чем через внешнее приложение.

V>Тут такие проблемы могут быть:

V>- "внешнее приложение" поставлять с инсталлятором? Это возможное нарушение лицензионного соглашения. А ADO, на машине уже есть почти всегда (если это не старые windows).
V>- Обрабатывать всевозможные ошибки при вызове этого приложения будет не проще, чем через ADO у которого, фактически, единственная возможная yf ghfrnbrt ошибка — не открытый connection.
V>- Имперсонация пользователя: как Вы это сделаете через sqlcmd? Далеко не всякий "генератор инсталляшек" это умеет.

V>Я как раз недавно сталкивался с такими проблемами, так как именно писал инсталлятор

V>Кстати, совет автору топика: отдельно проверять работу на 64-битном SQL Server. Тут возможны нюансы.

Да. Как раз имперсонацию-то я и делаю сначала. Затем уже проверяю базу. И в принципе код на ADO получился вполне лаконичным.
И 64х мы поддерживаем. Поэтому я немного озадачен. А какие там могут быть проблемы? Там где 32x вернет S_OK на 64х то же приложение может вернуть ошибку? Если да, то что тогда делать в таком случае?
Re[5]: Ошибка при попытке получить схему на ADO (C++)
От: pkarklin  
Дата: 30.10.08 14:10
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Исли Вы имеете в виду такие вещи, как проверка таблиц, их апдейт и тому подобные вещи, то да, их удобнее писать прямо на SQL.

V>Но вот запускать эти скрипты удобнее-таки через ADO, чем через внешнее приложение.

Вот далеко не факт. ADO не умеет отсылать на сервер в одном запросе скрипт, состоящий из нескольких бачей, разделенных GO. Придется самостоятельно читать и парсить на бачи скрипты.

V>Тут такие проблемы могут быть:

V>- "внешнее приложение" поставлять с инсталлятором? Это возможное нарушение лицензионного соглашения. А ADO, на машине уже есть почти всегда (если это не старые windows).

Гм... Часть файлов, в том числе и osql.exe, являются редистрибутируемыми, если у Вас есть MSDE, например.


V>- Обрабатывать всевозможные ошибки при вызове этого приложения будет не проще, чем через ADO у которого, фактически, единственная возможная yf ghfrnbrt ошибка — не открытый connection.


Уж куда проще обработать Exit Code. А ошибки в скрипте должен обрабатывать сам скрипт по-максимуму.

V>- Имперсонация пользователя: как Вы это сделаете через sqlcmd? Далеко не всякий "генератор инсталляшек" это умеет.


Эээ... Существует две возможных способа подключения. Сиквельный или виндовый логин. И в ADO и в утилитах командной строки можно использовать оба. Причем тут имперсонация?!

IMHO.
Re[6]: Ошибка при попытке получить схему на ADO (C++)
От: vmpire Россия  
Дата: 30.10.08 14:17
Оценка:
Здравствуйте, ariets, Вы писали:

A> Да. Как раз имперсонацию-то я и делаю сначала. Затем уже проверяю базу. И в принципе код на ADO получился вполне лаконичным.

A> И 64х мы поддерживаем. Поэтому я немного озадачен. А какие там могут быть проблемы? Там где 32x вернет S_OK на 64х то же приложение может вернуть ошибку? Если да, то что тогда делать в таком случае?
Я подробно не разбирался, есть ли проблема именно с ADO. Но мне попался один клиент, который работал с 32-битным SQL Server, но не работал с 64-битным.
Я не говорю, что оно не работает. Просто есть основание лишний раз проверить
Re[6]: Ошибка при попытке получить схему на ADO (C++)
От: vmpire Россия  
Дата: 30.10.08 14:27
Оценка:
Здравствуйте, pkarklin, Вы писали:

V>>Но вот запускать эти скрипты удобнее-таки через ADO, чем через внешнее приложение.

P>Вот далеко не факт. ADO не умеет отсылать на сервер в одном запросе скрипт, состоящий из нескольких бачей, разделенных GO. Придется самостоятельно читать и парсить на бачи скрипты.
А разве это так сложно? просто найти отдельно стоящие строки GO и разбить по ним скрипт.
Заодно решается проблема с обнаружением ошибок выполнения: когда у вас выполняется сразу много batchей, то если в одном была ошибка, то выполнение продолжается, что не всегда приемлемо.

V>>Тут такие проблемы могут быть:

V>>- "внешнее приложение" поставлять с инсталлятором? Это возможное нарушение лицензионного соглашения. А ADO, на машине уже есть почти всегда (если это не старые windows).
P>Гм... Часть файлов, в том числе и osql.exe, являются редистрибутируемыми, если у Вас есть MSDE, например.
Возможно, я не проверял. Поэтому и написал "возможное нарушение лицензионного соглашения".
Но в любом случае, зачем таскать с собой вещи, которые можно не таскать?

V>>- Обрабатывать всевозможные ошибки при вызове этого приложения будет не проще, чем через ADO у которого, фактически, единственная возможная ошибка — не открытый connection.

P>Уж куда проще обработать Exit Code. А ошибки в скрипте должен обрабатывать сам скрипт по-максимуму.
В ExitCode слишком мало информации. А что скрипт может сделать с ошибками? Как он покажет их пользователю? Парсить output sqlcmd.exe?

V>>- Имперсонация пользователя: как Вы это сделаете через sqlcmd? Далеко не всякий "генератор инсталляшек" это умеет.

P>Эээ... Существует две возможных способа подключения. Сиквельный или виндовый логин. И в ADO и в утилитах командной строки можно использовать оба. Причем тут имперсонация?!
Что если нужно запустить скрипт от имени Windows-пользователя, но не текущего? Например, от MYDOMAIN\Vasya?
Как это записать в командной строке?
Re[7]: Ошибка при попытке получить схему на ADO (C++)
От: pkarklin  
Дата: 30.10.08 14:35
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Здравствуйте, pkarklin, Вы писали:


V>А разве это так сложно? просто найти отдельно стоящие строки GO и разбить по ним скрипт.


Гм... Это не сложно, но зачем заниматься лишней работой?!

V>Заодно решается проблема с обнаружением ошибок выполнения: когда у вас выполняется сразу много batchей, то если в одном была ошибка, то выполнение продолжается, что не всегда приемлемо.


Не вижу проблем прекратить выполнение скрипта.

V>Но в любом случае, зачем таскать с собой вещи, которые можно не таскать?


Безусловно лучше вместо одного экзешника написать свой и таскать его.

V>В ExitCode слишком мало информации. А что скрипт может сделать с ошибками? Как он покажет их пользователю? Парсить output sqlcmd.exe?


Ошибки надо не показывать, а в лог складывать, дабы потом его можно было отправить саппорту. Результат работы sqlcmd умеет сама писать в файл без какого-либо доп. "парсинга".

V>Что если нужно запустить скрипт от имени Windows-пользователя, но не текущего? Например, от MYDOMAIN\Vasya?


Вам не кажется эта ситуация слишком надуманной?! А если Вы запустите в винде инсталляху не от текущего пользователя, то под каким пользователем по- Вашему будет выполняться вызванная этой инсталляшкой утилита командной строки.
Re[8]: Ошибка при попытке получить схему на ADO (C++)
От: vmpire Россия  
Дата: 30.10.08 14:55
Оценка:
Здравствуйте, pkarklin, Вы писали:

V>>Заодно решается проблема с обнаружением ошибок выполнения: когда у вас выполняется сразу много batchей, то если в одном была ошибка, то выполнение продолжается, что не всегда приемлемо.


P>Не вижу проблем прекратить выполнение скрипта.

Можно, но это лишние телодвижения уже в самом скрипте. Причём в каждом batch-e надо будет вставлять этот код.

V>>Но в любом случае, зачем таскать с собой вещи, которые можно не таскать?

P>Безусловно лучше вместо одного экзешника написать свой и таскать его.
Ну, тут согласен
Но если exe-шник уже есть, то второй уже не нужен

V>>В ExitCode слишком мало информации. А что скрипт может сделать с ошибками? Как он покажет их пользователю? Парсить output sqlcmd.exe?

P>Ошибки надо не показывать, а в лог складывать, дабы потом его можно было отправить саппорту. Результат работы sqlcmd умеет сама писать в файл без какого-либо доп. "парсинга".
Ага, вместо того, чтобы сказать пользователю "На базе есть пользователи, нужно отлогиниться" или "нет места на диске" нужно упасть, попросить отослать логи в саппорт, чтобы саппорт потом позвонил и сказал то же самое. Очень удобно.

V>>Что если нужно запустить скрипт от имени Windows-пользователя, но не текущего? Например, от MYDOMAIN\Vasya?

P>Вам не кажется эта ситуация слишком надуманной?!
Если посмотрите начало топика, то там как раз такая ситуация

V>>А если Вы запустите в винде инсталляху не от текущего пользователя, то под каким пользователем по- Вашему будет выполняться вызванная этой инсталляшкой утилита командной строки.

Нет, инсталлятор как раз работает от текущего пользователя, а вот коннектится надо от другого. Случай не частый, но встречается.
Re[9]: Ошибка при попытке получить схему на ADO (C++)
От: pkarklin  
Дата: 30.10.08 15:05
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Можно, но это лишние телодвижения уже в самом скрипте. Причём в каждом batch-e надо будет вставлять этот код.


Проверку ошибок в скрипте я не считаю лишней.

V>Ага, вместо того, чтобы сказать пользователю "На базе есть пользователи, нужно отлогиниться" или "нет места на диске" нужно упасть, попросить отослать логи в саппорт, чтобы саппорт потом позвонил и сказал то же самое. Очень удобно.


Не "вместо", а "вместе". Лог можно и пользователю показать и в сапорт отослать. А при разработке собственного обработчика ошибок на клиенте надо еще и в файл его уметь записывать. Что, опять же требует дополнительного кодинга.

V>Нет, инсталлятор как раз работает от текущего пользователя, а вот коннектится надо от другого. Случай не частый, но встречается.


Ну так куда проще в винде запустить инсталлятор от другого пользователя.

К чему все это я. А к тому, что я стараюсь по-максимому использовать имеющийся инструментарий, а не изобретать свой "велосипед", нарываясь на сабжевые ошибки.
Re[10]: Ошибка при попытке получить схему на ADO (C++)
От: vmpire Россия  
Дата: 30.10.08 15:22
Оценка:
Здравствуйте, pkarklin, Вы писали:

V>>Можно, но это лишние телодвижения уже в самом скрипте. Причём в каждом batch-e надо будет вставлять этот код.

P>Проверку ошибок в скрипте я не считаю лишней.
Я тоже. Но зачем писать один и тот же код в каждом batch-е, если можно написать его один раз в вызывающей программе?

V>>Ага, вместо того, чтобы сказать пользователю "На базе есть пользователи, нужно отлогиниться" или "нет места на диске" нужно упасть, попросить отослать логи в саппорт, чтобы саппорт потом позвонил и сказал то же самое. Очень удобно.

P>Не "вместо", а "вместе". Лог можно и пользователю показать и в сапорт отослать. А при разработке собственного обработчика ошибок на клиенте надо еще и в файл его уметь записывать. Что, опять же требует дополнительного кодинга.
Так, возвращаясь к вопросу. Удобно ли будет это реализовывать через sqlcmd? Как инсталлятор узнает, какая именно ошибка произошла? Логи в инсталляторе парсить?

V>>Нет, инсталлятор как раз работает от текущего пользователя, а вот коннектится надо от другого. Случай не частый, но встречается.

P>Ну так куда проще в винде запустить инсталлятор от другого пользователя.
А для других действий имперсонироваться обратно в текущего?

P>К чему все это я. А к тому, что я стараюсь по-максимому использовать имеющийся инструментарий, а не изобретать свой "велосипед", нарываясь на сабжевые ошибки.

Тут как раз случай, когда имеющийся инструментарий не вполне подходит для задачи. Конечно, используя командную строку и кучу сторонних утилит от разных производителей можно сделать почти всё, что угодно. Но вот поддерживать этот зоопарк зачастую сложнее, чем просто написать (один раз) сотню строчек на C++.
Re[11]: Ошибка при попытке получить схему на ADO (C++)
От: pkarklin  
Дата: 31.10.08 05:22
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Я тоже. Но зачем писать один и тот же код в каждом batch-е, если можно написать его один раз в вызывающей программе?


Для того, чтобы код в скрипте был самодостаточным и его функционирование не зависило от того, есть ли в "вызывающей" программе обработчик ошибок или нет.

V>Так, возвращаясь к вопросу. Удобно ли будет это реализовывать через sqlcmd? Как инсталлятор узнает, какая именно ошибка произошла? Логи в инсталляторе парсить?


Удобно. Результат выполнения sqlcmd определеяется по Exit Code. В случие <> 0 показываем лог, созданный sqlcmd. Не понимаю, что тут надо парсить?!

V>А для других действий имперсонироваться обратно в текущего?


Вам не кажется, что "вводные" появляются по ходу действий, как грибы после дождя?!

V>Тут как раз случай, когда имеющийся инструментарий не вполне подходит для задачи. Конечно, используя командную строку и кучу сторонних утилит от разных производителей можно сделать почти всё, что угодно. Но вот поддерживать этот зоопарк зачастую сложнее, чем просто написать (один раз) сотню строчек на C++.


Простите, но не "командную строку и кучу сторонних утилит", а всего лищь навсего вызов sqlcmd из стандартного инсталлятора, причем сама sqlcmd м.б. установлена тем же инсталлятором из стандартного пакета, скаченного с сайта Microsoft, впрочем, как и любые другие дистрибутируемые пакеты. Таким образом зоопарк будет представлять из себя набор стандартны msi пакетов.
Re[12]: Ошибка при попытке получить схему на ADO (C++)
От: vmpire Россия  
Дата: 31.10.08 13:09
Оценка:
Здравствуйте, pkarklin, Вы писали:

V>>Я тоже. Но зачем писать один и тот же код в каждом batch-е, если можно написать его один раз в вызывающей программе?

P>Для того, чтобы код в скрипте был самодостаточным и его функционирование не зависило от того, есть ли в "вызывающей" программе обработчик ошибок или нет.
Это — довод, согласен.

V>>Так, возвращаясь к вопросу. Удобно ли будет это реализовывать через sqlcmd? Как инсталлятор узнает, какая именно ошибка произошла? Логи в инсталляторе парсить?

P>Удобно. Результат выполнения sqlcmd определеяется по Exit Code. В случие <> 0 показываем лог, созданный sqlcmd. Не понимаю, что тут надо парсить?!
Не всякий пользователь знает SQL и помнит наизусть коды ошибок, чтобы понять этот лог. Не забывайте, что инсталляторами часто пользуются не программисты (рограммист и без инсталлятора скрипт запустить может)

V>>А для других действий имперсонироваться обратно в текущего?

P>Вам не кажется, что "вводные" появляются по ходу действий, как грибы после дождя?!
Не кажется. Ещё раз призываю посмотреть начало топика. Имперсонация там была с самого начала.

V>>Тут как раз случай, когда имеющийся инструментарий не вполне подходит для задачи. Конечно, используя командную строку и кучу сторонних утилит от разных производителей можно сделать почти всё, что угодно. Но вот поддерживать этот зоопарк зачастую сложнее, чем просто написать (один раз) сотню строчек на C++.


P>Простите, но не "командную строку и кучу сторонних утилит", а всего лищь навсего вызов sqlcmd из стандартного инсталлятора, причем сама sqlcmd м.б. установлена тем же инсталлятором из стандартного пакета, скаченного с сайта Microsoft, впрочем, как и любые другие дистрибутируемые пакеты. Таким образом зоопарк будет представлять из себя набор стандартны msi пакетов.

sqlcmd не достаточно по указанным выше причинам (имперсонация, нормальные сообщения об ошибках)
Re[13]: Ошибка при попытке получить схему на ADO (C++)
От: pkarklin  
Дата: 31.10.08 13:49
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Не всякий пользователь знает SQL и помнит наизусть коды ошибок, чтобы понять этот лог. Не забывайте, что инсталляторами часто пользуются не программисты (рограммист и без инсталлятора скрипт запустить может)


Ну почему же только коды. Все сообщение об ошибке в лог пишется, а не только код.

P>>Вам не кажется, что "вводные" появляются по ходу действий, как грибы после дождя?!

V>Не кажется. Ещё раз призываю посмотреть начало топика. Имперсонация там была с самого начала.

Там была имперсонация в одну сторону, которая реализуется совйствами винды. Обратной имперсонации я не вижу.

V>>>Тут как раз случай, когда имеющийся инструментарий не вполне подходит для задачи. Конечно, используя командную строку и кучу сторонних утилит от разных производителей можно сделать почти всё, что угодно. Но вот поддерживать этот зоопарк зачастую сложнее, чем просто написать (один раз) сотню строчек на C++.


V>sqlcmd не достаточно по указанным выше причинам (имперсонация, нормальные сообщения об ошибках)


Мне кажется мы друг друга не понимаем. И сообщения об ошибках полность показываются и имперсонация в части условий задачи выполняются.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.