Пишу на C# программку для работы с базой Pervasive SQL 2000. И не желает присоединяться. Вот соотв. фрагмент:
//Pervasive connection
String connStr = "Provider=PervasiveOLEDB;Data Source=<xxx>";
String commStr = "select ... from ...";
OleDbConnection conn = new OleDbConnection(connStr);
OleDbCommand commDb;
OleDbDataReader dbReader;
commDb = new OleDbCommand(commStr,conn);
conn.Open(); // здесь падает...
dbReader = commDb.ExecuteReader();
.....
Падает на Open() с вот таким сообщением:
System.Data.OleDb.OleDbException: Non-NULL controlling IUnknown was specified, and either the requested interfa
ce was not
IUnknown, or the provider does not support COM aggregation.
at System.Data.OleDb.OleDbConnection.ProcessResults(Int32 hr)
at System.Data.OleDb.OleDbConnection.CreateProviderError(Int32 hr)
at System.Data.OleDb.OleDbConnection.CreateProvider()
at System.Data.OleDb.OleDbConnection.Open()
at BIS.CS.CopySMcs.Run()
Как бы понять, что сие сообщение обозначает?
Точно такой фрагмент, но на VB.NET (c поправками на язык, конечно), нормально работает — присоединяет, данные выбирает и т.д.
Сразу скажу, что через OLE DB Data Provider ты не присоединишься к Pervasive
Для подключения к этому чуду программных технологий используй ODBC Data Provider, его совершенно бесплатно можно скачать на сайте мелкомягких, думаю найти там его сможешь. В стандартной поставке студии его нету.
Но не все так хорошо и с ним. Если при чтении из БД Pervasive в каком-либо поле присутствует пустая строка, именно пустая строка, то данный Data Provider падает с сообщением NO_DATA. Записи до данного прискорбного места получить в принципе можно. Это проблема не Pervasive, а самого ODBC Data Provider'а. Как сообщали в ньюса у мелкомягких, они уже борются с этой проблемой, ждем-с решения, а пока приходится извращаться и стараться в БД избегать записей, содержащих пустые строки.
----
With best regards, Kot Burov aka W@ndERR ®
UIN: 108043419
--------
Доброго времени суток, DkmS, Вы писали:
DS>Всё так и есть. Однако на VB.NET фокус с соединением по OLEDB проходит — всё выбирается и читается, даже с пустыми полями.
Мое предложение — покажи как у тебя на VB получилось, просто я не первый раз вижу, что у кого-то мол получается на VB подключиться к Pervasive через OLE DB Data Provider'а, но вот сам как-то не очень преуспел в этом, выдается таже сама ошибка. У нас проект как-раз на Pervasive, мы бы от него ушли, от сервера этого, но клиент настаивает
Короче, если делал что-то специфическое для подключения на VB — поделись.
----
With best regards, Kot Burov aka W@ndERR ®
UIN: 108043419
--------
W®>Мое предложение — покажи как у тебя на VB получилось, просто я не первый раз вижу, что у кого-то мол получается на VB подключиться к Pervasive через OLE DB Data Provider'а, но вот сам как-то не очень преуспел в этом, выдается таже сама ошибка. У нас проект как-раз на Pervasive, мы бы от него ушли, от сервера этого, но клиент настаивает
W®>Короче, если делал что-то специфическое для подключения на VB — поделись.
Отвлекаясь от незначащих деталей — примерно так:
Dim dbSource as OleDBConnection
Dim connSourceStr as String
connSourceStr = "Provider=PervasiveOLEDB;Data Source=<имя базы на сервере>;Location=<имя сервера>;Persist Security Info=False;Auto Translate=False|True"
dbSource = New OleDbConnection
dbSource.ConnectionString = connSourceStr
dbSource.Open
Dim rsSrcCmd as OleDbCommand
rsSrcCmd = new OleDbCommand
rsSrcCmd.Connection = dbSource
rsSrcCmd.CommandText = "select * from .... where ..."
Dim rsSrc as OleDbDataReader
rsSrc = rsSrcCmd.ExecuteReader()
For i = 0 To rsSrc.FieldCount-1 'все поля
rsSrc.GetName(i) - имя поля
rsSrc.Item(i) - значение поля
next
Не знаю, сильно ли это специфическое, но работает.