Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.09;
Скачать: CL | DM;

Вниз

Доступ к представлениям на MS SQL через ADO...   Найти похожие ветки 

 
MaXie ©   (2002-04-15 11:45) [0]

Тривиальный вопрос:
Есть ли возможность в Delphi получить доступ к представлениям на MS SQL сервере через ADO интерфейс?
... или как до них "достучаться"?!


 
Mike S ©   (2002-04-15 11:47) [1]

Так же как до таблиц.


 
MaXie ©   (2002-04-15 11:52) [2]

Да, но элемент класса TADOtable в своем поле TableName отображает только таблицы, находящиеся на SQL сервере.
При помощи элемента какого класса можно "увидеть" представления, находящиеся на SQL сервере?


 
Mike S ©   (2002-04-15 11:57) [3]

TADOQuery


 
MaXie ©   (2002-04-15 12:10) [4]

Я конечно мало что понимаю в Delphi, но как с помощью элемента ADOQuery, получить доступ к представлениям на MS SQL?
Насколько мне известно, в ADOQuery самостоятельно пишется текст SQL-запроса.
Вопрос же заключается в том, как связать элемент с запросом (представлением), которое уже написано и находится на SQL сервере?


 
wicked ©   (2002-04-15 12:15) [5]

2 MaXie ©
а чё, трудно написать select <поля> from <представление>?...
представление всё равно имеет вид таблицы и из него необходимо выбирать данные...


 
MaXie ©   (2002-04-15 12:23) [6]

ВСЕ С НАПИСАНИЕМ ПОНЯТНО - вопросов ни каких не возникает!
Вопрос ставится иначе: "Как получить доступ к представлениям, расположенным на MS SQL сервере, через ADO интерфейс?"

Зачем писать то, что уже написано!
Зачем давать доступ к базовой таблице (даже на просмотр SELECT), если для этого предусмотрены представления, граммотно ограничивающие доступ пользователей к данным?

Так есть в Delphi возможность связать элемент с представлением на MS SQL Server или все-таки нет?


 
wicked ©   (2002-04-15 12:27) [7]

2 MaXie ©
а что ты понимаешь под словом ADO-интерфейс?...
он весь и построен на sql-запросах... а ADOTable, кстати, не рекомендуется использовать, он оставлен для лёгкости перевода старых bde-шных приложений под ado... конечно, ado напрямую поддерживает вещи типа ADOTable, но и microsoft оставила его в сиротах...
видать не судьба... придётся тебе писать select"ы ручками... :)


 
MaXie ©   (2002-04-15 12:41) [8]

2wicked

Понимаешь, wicked, проблема то заключается не в "ручках", а в ограничении доступа к данным, хранящимся на SQL сервере. Есть набор представлений, через которые осуществляется ограниченный доступ к системным и базовым таблицам Базы Данных. Как в этом случае с клиента получить доступ к информации? Писать запрос к представлению? Я понимаю, что представления, фактически, те же самые таблицы, но вот как и при помощи чего их "увидеть" при написании клиента?

P.S. Да, есть способ "достучаться" через ODBC к представлениям, но в этом случае на каждой клиентской машине необходимо предварительно его настроить (прописать учетную запись доступа к БД).


 
Mike S ©   (2002-04-15 12:58) [9]

select *
from dbo.sysobjects o
where OBJECTPROPERTY(o.id, N"IsView") = 1

может это тебе поможет.


 
Delirium ©   (2002-04-15 13:01) [10]

> MaXie © (15.04.02 11:52)

> Да, но элемент класса TADOtable в своем поле TableName отображает только таблицы, находящиеся на SQL сервере.

Это не правда - TADOTable, применительно к MSSQL, передоставляет полный список таблиц и представлений, разрешённых для использования конкретным логином. Если вы чего-то не находите проверьте права доступа.


 
Mike S ©   (2002-04-15 13:19) [11]

Delirium © (15.04.02 13:01)
Это правда видно.


 
Delirium ©   (2002-04-15 13:33) [12]

> Mike S ©
Не будем спорить на словах - обратимся к исходникам, вот кусочек из ADODB.pas


procedure TADOConnection.GetTableNames(List: TStrings;
SystemTables: Boolean);
var
TypeField,
NameField: TField;
TableType: string;
DataSet: TADODataSet;
begin
CheckActive;
DataSet := TADODataSet.Create(nil);
try
OpenSchema(siTables, EmptyParam, EmptyParam, DataSet);
TypeField := DataSet.FieldByName("TABLE_TYPE"); { do not localize }
NameField := DataSet.FieldByName("TABLE_NAME"); { do not localize }
List.BeginUpdate;
try
List.Clear;
while not DataSet.EOF do
begin
TableType := TypeField.AsString; // Как видно ниже выбираются и таблицы и представления
if (TableType = "TABLE") or (TableType = "VIEW") or
(SystemTables and (TableType = "SYSTEM TABLE")) then
List.Add(NameField.AsString);
DataSet.Next;
end;
finally
List.EndUpdate;
end;
finally
DataSet.Free;
end;
end;


А что касается MSSQL, то он корректно возвращает тип объекта (table, view или system table) так что претензии MaXie к Borland-у необоснованы.


 
MaXie ©   (2002-04-15 14:21) [13]

>Delirium ©

На мой логин указывается явный доступ к представлению с возможностью просмотра (SELECT) и добавления (INSERT) данных.
В модуль данных добавляется элемент класса TADOTable. В свойстве Connection указывается имя элемента класса TADOConnection, который обеспечивает соединение клиента с БД. Заходим в список доступных таблиц TableName - имени представления, к которому на мой логин явно указан доступ, нет!
Что я делаю не так, что не позволяет мне "увидеть" представление?


 
Johnmen ©   (2002-04-15 14:27) [14]

И гранды на вью выданы, да ?


 
S_S_S   (2002-04-15 16:52) [15]

2 Johnmen
>На мой логин указывается явный доступ к представлению с возможностью просмотра (SELECT) и добавления (INSERT) данных.

А это что тогда?

>MaXie
попробуйте через ЕМ просмотреть вашу вьюху



Страницы: 1 вся ветка

Текущий архив: 2002.05.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
3-25994
SergeyDon
2002-04-15 14:35
2002.05.09
InterBase хранимые процедуры.


1-26193
Freek
2002-04-25 15:46
2002.05.09
Как найти файл в реестре?


4-26308
Афоня
2002-03-05 11:42
2002.05.09
Перехват сообщения вывода строки из консольного приложения


1-26078
Невидимка
2002-04-26 13:03
2002.05.09
Вывод диалога и сохранение файла...


1-26118
IDL
2002-04-24 12:54
2002.05.09
Закрытие проги после закрытия ПОСЛЕДНЕГО окна?