OpenSchema из ADO на С#
От: AndreyStr  
Дата: 23.10.02 18:13
Оценка:
Кто знает как использовать Connection.OpenSchema на C#. Какие задавать параметры?
Интересует именно ADO(а не ADO.Net) и именно С#(а не С++ и VB)

Заранее благодарю за ответы.
Re: OpenSchema из ADO на С#
От: SCS  
Дата: 24.10.02 04:38
Оценка:
Здравствуйте AndreyStr, Вы писали:

AS>Интересует именно ADO(а не ADO.Net) и именно С#(а не С++ и VB)





using System.Reflection;
using ADODB; // <-- импорт COM из msado15.dll (Microsoft ActiveX Data Objects 2.7 Library)


private void button1_Click(object sender, System.EventArgs e)
{ 
...
  ConnectionClass cn=new ADODB.ConnectionClass();
  ADODB.RecordClass rs;

  cn.Open("Provider=SQLOLEDB.1;Password=9130312;Persist Security Info=True;User ID=sa;Initial Catalog=dda9;Data Source=SRV1-32","sa","xxxxxxxxx",-1);
...
  rs=cn.OpenSchema(ADODB.SchemaEnum.adSchemaTables); // <-- что ж здесь непонятного ??? 
...
}


Описание параметров adSchema[..] (запрос схем каталогов, таблиц, и пр.) см. в RTFM по ADO (а не ADO.Net) и именно по С++ и VB (а не C#)
SCS
Re[2]: OpenSchema из ADO на С#
От: AndreyStr  
Дата: 24.10.02 07:25
Оценка:
Здравствуйте SCS, Вы писали:

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


AS>>Интересует именно ADO(а не ADO.Net) и именно С#(а не С++ и VB)


SCS> rs=cn.OpenSchema(ADODB.SchemaEnum.adSchemaTables); // <-- что ж здесь непонятного ???


А как это работает?:
у меня на подобную запись компилятор выдает ошибку:
No overload for method 'OpenSchema' takes '1' arguments

И это понятно, т.к. С# не поддерживает перегрузку методов с различным количеством параметров,
я это не придумал, вот цитата из ADO.Net Professional:

Once we've got our RCW for the ADODB library, using it is similar to using it from VB 6. The one major
point to be aware of if you're writing C# code is that C# doesn't support optional parameters to method calls,
so all parameters will need to be included. This complicates method calls significantly, so make sure you've
got a reference to the ADO object model handy!

Т.е. обязательным условием является заполнение всех аргументов методов, т.е. в
recordset = connection.OpenSchema (QueryType, Criteria, SchemaID)
в любом случае надо заполнить и Сriteria и SchemaID.

Вообщем проблема сводится к заполнению этих параметров:
как в передать параметру критерия(типа Object) параметр типа Variant?
Re[3]: OpenSchema из ADO на С#
От: SCS  
Дата: 24.10.02 08:07
Оценка:
Здравствуйте AndreyStr, Вы писали:

AS>А как это работает?:

AS>в любом случае надо заполнить и Сriteria и SchemaID.


using System.Reflection;
using ADODB;

private void button1_Click(object sender, System.EventArgs e)
{
ConnectionClass cn=new ADODB.ConnectionClass();
cn.Open("Provider=SQLOLEDB.1;Password=9130312;Persist Security Info=True;User ID=sa;Initial Catalog=tadm;Data Source=SRV1-32","sa","9130312",-1);
...
object vtm=new object();
vtm=Missing.Value; // <-- для всех полей, которые пропускаешь в VB, здесь ОБЯЗАТЕЛЬНО (см. ADO + Reflection)

ADODB.RecordsetClass rs;
rs=(ADODB.RecordsetClass)(cn.OpenSchema(ADODB.SchemaEnum.adSchemaTables, vtm, vtm));
...
}
SCS
Re[4]: OpenSchema из ADO на С#
От: AndreyStr  
Дата: 24.10.02 08:23
Оценка:
Здравствуйте SCS, Вы писали:

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


Огромное Спасибо, это работает!!!

Но все таки, как быть если мне надо все-таки использовать 2-й параметр.
Например, для получения списка индексов конкретной таблицы?
Re[5]: OpenSchema из ADO на С#
От: SCS  
Дата: 24.10.02 08:52
Оценка:
Здравствуйте AndreyStr, Вы писали:


пример, как поставить фильтр только на таблицы пользователей. Про индексы, думаю, будет нечто похожее.

...
  object vtm=new object();
  vtm=Missing.Value;

  object[] cnt=new object[4]{null, null, null, "TABLE"};
...
  rs=(ADODB.RecordsetClass)(cn.OpenSchema(ADODB.SchemaEnum.adSchemaTables, cnt, vtm));
...
SCS
Re[6]: OpenSchema из ADO на С#
От: AndreyStr  
Дата: 24.10.02 09:10
Оценка:
Здравствуйте SCS, Вы писали:

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


SCS>

SCS>пример, как поставить фильтр только на таблицы пользователей. Про индексы, думаю, будет нечто похожее.

SCS>
SCS>...
SCS>  object vtm=new object();
SCS>  vtm=Missing.Value;

SCS>  object[] cnt=new object[4]{null, null, null, "TABLE"};
SCS>...
SCS>  rs=(ADODB.RecordsetClass)(cn.OpenSchema(ADODB.SchemaEnum.adSchemaTables, cnt, vtm));
SCS>...
SCS>



Урррррра!
Работает!
Большое спасибо!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.