powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ODBC, Создать DSN
25 сообщений из 31, страница 1 из 2
ODBC, Создать DSN
    #34395996
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здрасьте.

У меня получается создать DSN таким образом.
Код: plaintext
1.
char *szAttributes = "DSN=TestX\0SERVER=MY_COMP\\DB\0DATABASE=Test\0"; 
nRtCode = SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN, "SQL Server", szAttributes ); 
или можно переставить параметры в строке так
Код: plaintext
char *szAttributes = "SERVER=MY_COMP\\DB\0DSN=TestX\0DATABASE=Test\0"; 
Где:
DSN=TestX
SERVER=MY_COMP\DB
DATABASE=Test.

Проблема в том, что имя сервера мне необходимо получить как параметр и вставлять его в строку. Опробованным способам нет числа, но DSN не создаётся!

Первое, что было опробовано:
Код: plaintext
1.
TCHAR szAttributes[ 1024 ]; 
sprintf(szAttributes, "DSN=TestX\0SERVER=%s\\DB\0DATABASE=Test\0", Server); 
или вот ещё
Код: plaintext
1.
2.
TCHAR szAttributes[ 1024 ];
sprintf(szAttributes, "SERVER=%s",Server);
strcat(szAttributes, "\\DB\0DSN=TestX\0DATABASE=Test\0");

И много ещё чего, но все впустую. Вся проблема в этих символах конца строки, по-моему.

Прошу помощи, в общем.
Спасибо.
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396020
Олег Нов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
TCHAR szAttributes[ 1024 ];
wsprintf("DSN=TestX\0SERVER=%s\\DB\0DATABASE=Test\0", szAttributes); 
nRtCode = SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN, "SQL Server", szAttributes ); 
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396042
Олег Нов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри. Вот так правильно

Код: plaintext
1.
2.
3.
4.
5.
CString myStr;
myStr="MY_COMP";

TCHAR szAttributes[ 1024 ];
szAttributes=wsprintf("DSN=TestX\0SERVER=%s\\DB\0DATABASE=Test\0", myStr); 
nRtCode = SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN, "SQL Server", szAttributes ); 
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396058
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег Нов...

Код: plaintext
wsprintf(szAttributes,"DSN=TestX\0SERVER=%s\\WINCC\0DATABASE=Test\0", Server);

И такое тоже не работает :(
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396066
Олег Нов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавь для визуального контроля
Код: plaintext
AfxMessageBox(szAttributes);
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396073
Олег Нов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дефинацию Server - в студию !!! плиз
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396095
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег НовДобавь для визуального контроля
Код: plaintext
AfxMessageBox(szAttributes);


Так все время контролирую! После wsprintf пишет "DSN=TestX". С чем в общем-то я согласна, дальше то символ конца строки.
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396100
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег НовДефинацию Server - в студию !!! плиз

char *Server;

ну и, соответственно, это сейчас MY_COMP.
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396128
Олег Нов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перед wsprintf
Код: plaintext
AfxMessageBox(Server);
должно вывести
MY_COMP

После
Код: plaintext
AfxMessageBox(szAttributes+ 10 );
должно вывести
SERVER=MY_COMP\\DB
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396144
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
видел?


--------------------------------------------------------------
[подпись с другого сайта]
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396151
Олег Нов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скорее всего Server не присваивается значение "MY_COMP";
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396170
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег НовПеред wsprintf
Код: plaintext
AfxMessageBox(Server);
должно вывести
MY_COMP

После
Код: plaintext
AfxMessageBox(szAttributes+ 10 );
должно вывести
SERVER=MY_COMP\\DB


Эээээ... Как-то теряюсь.
Значит так:
Код: plaintext
1.
2.
AfxMessageBox(Server);
wsprintf(szAttributes,"DSN=TestX\0SERVER=%s\\WINCC\0DATABASE=Test\0", Server); 
AfxMessageBox(szAttributes+ 10 );

В МесиджБоксе вижу
сначала MY_COMP
затем ровно 1024 одинаковых кракозябины и в конце три неодинаковых. К чему бы это?
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396209
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег Новскорее всего Server не присваивается значение "MY_COMP";


Не думаю. Ведь можно и местами поменять так:

Код: plaintext
1.
szAttributes=wsprintf("SERVER=%s\\DB\0DSN=TestX\0DATABASE=Test\0", myStr); 
AfxMessageBox(szAttributes);

Тогда на выходе видим SERVER=MY_COMP\DB
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396228
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrum видел?


--------------------------------------------------------------
[подпись с другого сайта]


Спасибо, смотрю.
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396346
Олег Нов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
посмотрел MSDN (давненько на С не программировал - последнее время все как-то Oracle)
sprintf и все остальные (wsprintf, ...) используют форматную строку ограниченную нулем,
поэтому после первого вхождения \0 эта строка на этом заканчивается,
то есть Мы работаем на самом деле не с "DSN=TestX\0SERVER=%s\\DB\0DATABASE=Test\0"
а с "DSN=TestX"
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396393
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег Новпосмотрел MSDN (давненько на С не программировал - последнее время все как-то Oracle)
sprintf и все остальные (wsprintf, ...) используют форматную строку ограниченную нулем,
поэтому после первого вхождения \0 эта строка на этом заканчивается,
то есть Мы работаем на самом деле не с "DSN=TestX\0SERVER=%s\\DB\0DATABASE=Test\0"
а с "DSN=TestX"

Это ясно, однако, при статичном задании строки аттрибутов в SQLConfigDataSource с terminate symbol в качесве разделителя между параметрами, всё работает. Я пробовала двойной слэш ставить "\\0", не работает тоже.
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396406
Олег Нов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S. после MSDN самому стало интересно. Запустил Visual Studio и попробовал следующее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	char* Server;
	Server="MY_COMP";

	TCHAR szAttributes[ 1024 ];
	wsprintf(szAttributes   ,"DSN=TestX");
	wsprintf(szAttributes+ 10 ,"SERVER=%s\\DB\0DATABASE=Test", Server); 
	//AfxMessageBox(szAttributes);
	//AfxMessageBox(szAttributes+10);

	nRtCode = SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN, "SQL Server", szAttributes ); 

Вот так правильно
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396445
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrum видел?


--------------------------------------------------------------
[подпись с другого сайта]


Смотрю и не вижу. :( Точнее не понЫмаю. Не могли бы Вы пояснить.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
struct key_value_pair ODBC_KeyWords[] = {{"DSN=TestX", NULL},{"SERVER=%s\\DB", NULL},{"DATABASE=Test", NULL}};

buf = malloc( 1024 );
d = buf;

for(int i =  0 ; i < sizeof(ODBC_KeyWords)/sizeof(ODBC_KeyWords[ 0 ]); i++ )
{
sprintf(d, ODBC_KeyWords.format, ODBC_KeyWords[i].value); 
d += strlen(d)+ 1 ;
}
*(d++) =  0 ; 


1. тип переменных buf и d (char* и char[160], соответственно)?
2. не прочувствовался смысл деления размера всей структуры на размер первого элемента "sizeof(ODBC_KeyWords)/sizeof(ODBC_KeyWords[0])"
3. ODBC_KeyWords [i].format
4. ODBC_KeyWords.value
5. откуда этот тип "key_value_pair"

Спасибо большое.
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396475
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Олег НовP.S. после MSDN самому стало интересно. Запустил Visual Studio и попробовал следующее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	char* Server;
	Server="MY_COMP";

	TCHAR szAttributes[ 1024 ];
	wsprintf(szAttributes   ,"DSN=TestX");
	wsprintf(szAttributes+ 10 ,"SERVER=%s\\DB\0DATABASE=Test", Server); 
	//AfxMessageBox(szAttributes);
	//AfxMessageBox(szAttributes+10);

	nRtCode = SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN, "SQL Server", szAttributes ); 

Вот так правильно

И у вас создается DSN? :О У меня все то же nRtCode = 0.
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396479
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это ты спроси у того, кто мне это насоветовал

я сделал так:

часть параметров (до разделяющего \0) записал с помощью функции SQLConfigDataSource, остальные внес через реестр с помощью функций по работе с реестром объявленных в библиотеке advapi32.dll,
так как все равно необходимой функциональности SQLConfigDataSource не обеспечит!
--------------------------------------------------------------
[подпись с другого сайта]
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396603
FaceAgainstFloor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrumэто ты спроси у того, кто мне это насоветовал

я сделал так:

часть параметров (до разделяющего \0) записал с помощью функции SQLConfigDataSource, остальные внес через реестр с помощью функций по работе с реестром объявленных в библиотеке advapi32.dll,
так как все равно необходимой функциональности SQLConfigDataSource не обеспечит!
--------------------------------------------------------------
[подпись с другого сайта]

А что там было до нуля, только "DSN=%s" и всё. Т.е. ты всё делал через реестр? И какова переносимость на другие версии Windows? Мне надо сделать так, чтобы всё работало веками без посторонней руки, без переписки API функций...
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396654
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FaceAgainstFloor1. тип переменных buf и d (char* и char[160], соответственно)?нет конечно. Откуда вы сударыня выкопали char[160]??? Обе переменные простые указатели.

FaceAgainstFloor2. не прочувствовался смысл деления размера всей структуры на размер первого элемента "sizeof(ODBC_KeyWords)/sizeof(ODBC_KeyWords[0])"Делится не структура, а массив структур на размер первого элемента массива - вычисление размера статического массива на этапе препроцессора.

FaceAgainstFloor3. ODBC_KeyWords .format
4. ODBC_KeyWords.value
И то и другое либо массивы char либо указатели на char, как удобнее так и делаешь.

FaceAgainstFloor5. откуда этот тип "key_value_pair"Сам придумал.

А если SQLConfigDataSource вернул 0 - запусти SQLInstallerError и узнаешь что именно в твоем наборе параметров неправильно.

А если не умеешь работать с массивами и лень учится работать с массивами, то можно сделать по другому:
Код: plaintext
1.
sprintf(szAttributes,"DSN=TestX;SERVER=%s\\WINCC;DATABASE=Test;", Server);
for(int i= 0 ; szAttributes[i]; i++) if (szAttributes[i]==';') szAttributes[i]= 0 ;
То есть сделай примитивную строку с каким-либо уникальным символом разделителем между парами ключ=значение, а потом пробеги по резултату и замени все временные разделители на нули.
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396668
Олег Нов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я полагал, что проблема с форматированием, она решена (см.предыдущий пост),
а что касается DSN, считаю создание DSN-нов порочной практикой.

Ведь если можно обойтисть без DSN, то не нужно их вообще создавать.
Например

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CDatabase *myDb=new CDatabase;
// Налогоплательщик 2006
CString ConnectionString = "DRIVER={Microsoft FoxPro VFP Driver (*.dbf)}"
";SourceDB=C:\\NP2006W\\B1\\BASE\\BASE.DBC;SourceType=DBC;Exclusive=No;BackgroundFetch=Yes;Collate=Russian;Null=No;Deleted=Yes;";	

if (myDb->OpenEx(ConnectionString, CDatabase::useCursorLib) !=  0 )
{
       ....;
} 


Это моя личная точка зрения (софт пишется для людей, в том числе и для инсталяторов,
нефиг пакостить за собой в реестре и прочих местах, переписал с CD диска и все, работай,
надо удалить - сотри каталог с прогой)
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396673
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumчасть параметров (до разделяющего \0) записал с помощью функции SQLConfigDataSource, остальные внес через реестр с помощью функций по работе с реестром объявленных в библиотеке advapi32.dll,
так как все равно необходимой функциональности SQLConfigDataSource не обеспечит!Не правда - SQLConfigDataSource может сделать dsn любого типа с любыми параметрами плюс еще и проверит правильность создания.
Самому лазить для создания DSN в регистри глупо и опасно.
...
Рейтинг: 0 / 0
ODBC, Создать DSN
    #34396693
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Олег НовЯ полагал, что проблема с форматированием, она решена (см.предыдущий пост),
а что касается DSN, считаю создание DSN-нов порочной практикой.

Ведь если можно обойтисть без DSN, то не нужно их вообще создавать.Это верно и правильно до тех пор, пока не возникнет необходимость подключать две и больше программ к одной и той же базе. DSN позволяет указывать всем программам только имя dsn а конкретные параметры сервера/базы будут хранится в dsn - базу можно будет прозрачно для юзера переносить на другие сервера.
dsn-less коннекты удобны только пока ты один-единственный клиент к базе.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / ODBC, Создать DSN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]