Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отобразить View в DataGridView, SQL Server 
V
    Опции темы
Moid
Дата 19.11.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: нет
Всего: 3



Создал в SQL Server свой View, который отображает данные из нескольких таблиц + виртуальные поля созданные запросом(такие как Sum и Count)
Как мне отобразить его в DataGridView? 
Или может я выбрал не правильный подход...


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Idsa
Дата 19.11.2008, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Moid, так же, как и таблицу. Не считая некоторых нюансов, на уровне sql-запроса View равносильно таблице.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Moid
Дата 19.11.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: нет
Всего: 3



Idsa,  Не совсем понятно...
Как вариант рассмотрел следующее, тогда и использование вью опадает: тот запрос что выполняется во View выполнить и заполнить свой DataTable, затем привязать его к DataGridView.



--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Idsa
Дата 19.11.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Moid @  19.11.2008,  16:41 Найти цитируемый пост)
тот запрос что выполняется во View выполнить

Вам не нужно думать о том, какой запрос выполняется во View. Используйте ее как обычную таблицу.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Moid
Дата 19.11.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: нет
Всего: 3



Еще момент: можно ли в запрос View подставить програмно значения переменных, как к примеру это можно сделать при заполнении таблицы методами из xsd.
Если нет, то в принципе тогда и отпадает нужда использовать View, а формировать запрос через строку.


--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
Idsa
Дата 19.11.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Moid @  19.11.2008,  16:54 Найти цитируемый пост)
можно ли в запрос View подставить програмно значения переменных

Нет, нельзя. Используйте голые запросы или хранимые процедуры.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Moid
Дата 19.11.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 396
Регистрация: 27.3.2006

Репутация: нет
Всего: 3



Idsa, спасибо... тогда тема закрыта.



--------------------
"Всё должно быть сделано настолько простым, насколько это возможно, но не проще" (с) А.Эйнштейн
PM MAIL   Вверх
MasterOfCode
Дата 19.11.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Цитата(Moid @  19.11.2008,  14:54 Найти цитируемый пост)
Еще момент: можно ли в запрос View подставить програмно значения переменных, как к примеру это можно сделать при заполнении таблицы методами

В чем проблемма, VIEW эта та же таблица.

Код

create or replace view NameView
as
select 11 as field_1 from dual

и потом так:
Код

SqlCommand cmd;
...
cmd.CommandText = "select * from NameView where field_1 = 11";


или я что то не так понял?

Это сообщение отредактировал(а) MasterOfCode - 19.11.2008, 14:10


--------------------
user posted image
PM ICQ   Вверх
Idsa
Дата 19.11.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



MasterOfCode, http://databases.aspfaq.com/database/shoul...d-function.html
Цитата

A view does not accept parameters, which is definitely a strange concept for users migrating from Microsoft Access. To restrict the rows returned by a view, you use a WHERE clause in the query that is accessing the view, not in the view itself. Table-valued functions, described further down, are more like parameterized views; in fact, they were called parameterized views during development, according to Hal Berenson. 

Т. е. мы не может сделать select from SomeView(@param1, @param2...).

Цитата(MasterOfCode @  19.11.2008,  18:04 Найти цитируемый пост)
или я что то не так понял?

Допустим, нам нужно сделать View, выбирающую определенный диапазон значений.
Код

SELECT     CertificationID, CertificationName
                           FROM         dbo.vw_TMS_Certifications
                           WHERE     CertificationID = @CertificationID

Такой запрос во View не прокатит. Получается, отсеивать значения нужно во внешнем относительно View запросе, как в Вашем примере. Во-первых, это неудобно. Гораздо удобнее воспользоваться table-valued function:
Код

CREATE FUNCTION dbo.GetCertificate(@CertificateID int)
RETURNS TABLE
AS
   RETURN SELECT CertificationID, CertificationName
                           FROM dbo.vw_TMS_Certifications
                           WHERE CertificationID = @CertificationID
GO
SELECT * FROM dbo.GetCertificate(47) 

Во-вторых, возможны проблемы с производительностью: ведь мы сначала считываем все значения View, а только потом отбираем нужные. Хотя, наверное, современные оптимизаторы запросов это дело красиво разруливают.
Если предыдущее утверждение насчет производительности, скорее всего, неактуально... есть еще один вариант. Зачастую View используются для того, чтобы ограничить доступ пользователей к таблицам, атрибутам и т. д. Допустим, DBA хочет, чтобы пользователь мог получить информацию только по одному пользователю. Через вьюху этого не сделаешь, т. к. она возвращает все данные. А если в таблице 20 миллионов записей? Так неопытный "писун" прикладного приложения может повесить сервак, если не добавит надлежащих ограничений в where.
Таких примеров можно напридумывать кучу (фантазия у меня - дай Бог smile ).

Это сообщение отредактировал(а) Idsa - 19.11.2008, 14:51


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
MasterOfCode
Дата 19.11.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Цитата(Idsa @  19.11.2008,  16:29 Найти цитируемый пост)
Допустим, DBA хочет, чтобы пользователь мог получить информацию только по одному пользователю.

немного не понял... это как по одному пользователю?


--------------------
user posted image
PM ICQ   Вверх
Idsa
Дата 19.11.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(MasterOfCode @  19.11.2008,  19:59 Найти цитируемый пост)
немного не понял... это как по одному пользователю? 

Это я говорил о воображаемой таблице Users, к которой используется запрос:
Код

select Name, Surname
from Users
where UserId = @UserId - View так не может :)



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
MasterOfCode
Дата 19.11.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Ну дак понятно. Для этого и существует возможность фильтровать вьюшку в запросе smile
У нас тут почти все на вьюшках построенно. И работает я скажу без потери производительности, хотя я не проверял, но не скажу что долго.
Что это за база такая которая повиснет при выборе 20 млн записей? какая нибудь настольная, но если у тебя есть 20млн записей, то имхо нужно что то по серьезнее использовать smile


--------------------
user posted image
PM ICQ   Вверх
Idsa
Дата 20.11.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Насчет производительности - это все догадки и, скорее всего, неверные.
Но в любом случае отсутствие возможности передавать во View параметры не дает реализовать некоторые типы View.
Допустим, нужно вернуть пользователей, зарегистрированных с одной даты по другую. Имея View, возвращающую всех пользователей, пишем запрос:
Код

select * from UsersView
where RegistrationDate >= date1 and RegistrationDate <= date2;

Теперь посмотрим, как это можно реализовать черзе table-valued function, внутрь которой уже заложена логика по отбору пользователей по дате регистрации:
Код

select * from UsersFunction(date1, date2);

Удобнее, неправда ли?
Это я все к тому, что порой действительно удобнее инкапсулировать логику отбора в table-valued function, нежели приписывать ее к внешнему where к View.

Это сообщение отредактировал(а) Idsa - 20.11.2008, 19:50


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
MasterOfCode
Дата 21.11.2008, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 4
Всего: 27



Цитата(Idsa @  20.11.2008,  21:49 Найти цитируемый пост)
вернуть пользователей, зарегистрированных с одной даты по другую

Я бы использовал between в условии.

Цитата(Idsa @  20.11.2008,  21:49 Найти цитируемый пост)
Удобнее, неправда ли?

Только визуальнее. А внутри у этой функции тот же самый between smile
Если бы view можно было принимать параметры - это было бы не view.  Если тебе удобнее писать так. То не кто не запрещает. smile

Мне вот интересно, table-valued function можно связать join'ом например с другими таблицами? smile


--------------------
user posted image
PM ICQ   Вверх
Idsa
Дата 21.11.2008, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(MasterOfCode @  21.11.2008,  10:58 Найти цитируемый пост)
Мне вот интересно, table-valued function можно связать join'ом например с другими таблицами? 

Можно.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.