Бодрого всем времени суток.
Проблема следующая. Есть SQL сервер 2000. Есть клиентские машины, на которых работает ПО, которое подключается к этому SQL серверу. На некоторых клиентских машинах с некоторыми операционными системами (как правило Win2K) ПО не может подключиться к серверу ("Server not exists or access denied" и т.п.). Лечили это тем, что в источниках данных ODBC создавали новый источник SQL, который настраивался на работу по TCP/IP (а не по именованным каналам, как в таких случаях предлагалось по умолчанию).
Ситуация усложняется тем, что с одной клиентской машины может осуществляется соединение с несколькими SQL серверами. В большинстве случаев создание единственного источника ODBC для единственного IP сервера помогала осуществить соединение и ко всем остальным серверам, но встречались некоторые экземпляры систем, где приходилось настравить таким образом источник для каждого сервера индивидуально.
Насколько понимаю, это можно полечить еще и с помощью SQL Server Client Network Utility, но ручками.
Посему вопрос. Возможно ли в коде при подключении указать, что необходимо использовать подключение по TCP/IP, или настроить SQL клиента программно.
Вот кусок кода, который используется для подключения к SQL серверу:
void CDBConnection::OpenDataSource(LPCTSTR server, LPCTSTR database, LPCTSTR login, LPCTSTR password)
{
HRESULT hr;
CDataSource db;
CDBPropSet dbinit(DBPROPSET_DBINIT);
CString str;
{
_bstr_t bstrPwd(password);
dbinit.AddProperty(DBPROP_AUTH_PASSWORD, (BSTR)bstrPwd);
}
{
_bstr_t bstrLogin(login);
dbinit.AddProperty(DBPROP_AUTH_USERID, (BSTR)bstrLogin);
}
if(database)
{
_bstr_t dbName(database);
dbinit.AddProperty(DBPROP_INIT_CATALOG, (BSTR)dbName);
}
if(server)
{
_bstr_t sqlServer(server);
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, (BSTR)sqlServer);
}
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1049);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)DBPROMPT_NOPROMPT);
// устанавливает timeout на соединение с БД, в секундах
dbinit.AddProperty(DBPROP_INIT_TIMEOUT, (long)m_timeOut);
// устанавливает timeout на выполнение команды, в секундах
// 0 - timeout отсутствует
dbinit.AddProperty(DBPROP_COMMANDTIMEOUT, (long)0);
hr = db.Open( "SQLOLEDB.1", &dbinit);
if (FAILED(hr))
{
str = GetDBErrorRecords(hr);
throw(str);
}
hr = m_session.Open(db);
if(FAILED(hr))
{
str = GetDBErrorRecords(hr);
throw(str);
}
...
}