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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> хранимая процедура. На выходе таблица 
V
    Опции темы
kinder999
Дата 11.10.2010, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток.
    Имеется в БД хранимая процедура ShowTest (входящий параметр int ids). Процедура возвращает временную таблицу (по запросу):
Код

Running [dbo].[ShowTest] ( @idS = 12 ).

ID     groupA groupQ 
------ ------ ------ 
73     0      1      
69     0      1      
78     0      2      
76     0      2      
74     0      2      
82     0      3      
No rows affected.
(6 row(s) returned)
@RETURN_VALUE = 0
Finished running [dbo].[ShowTest].


Вопрос, как мне получить данные, которые возвращаются в виде таблицы?

Пробывал как в msdn (http://msdn.microsoft.com/ru-ru/library/bb399407.aspx) сделать
Код

DCDataContext db = new DCDataContext();
var result = db.ShowTest(testID);

но т.к. @RETURN_VALUE = 0, result=0.

Заранее спасибо за ответы.
PM MAIL   Вверх
jonie
Дата 11.10.2010, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



не вижу проблем. Видео с нуля до запросов (и результатов на форме) в аттаче (это 7z архив)..

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Video_2010_10_11_222136.doc 899,19 Kb


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kinder999
Дата 12.10.2010, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за видео, но это немножко не то...
Я делаю это в WCF, для того, что бы потом передать в Silverlight
Я не понимаю, как можно получить эту таблицу, что бы её потом обработать в коде WCF использую Linq to SQL
Если можно, то приведите, пожалуйста, пример кода
PM MAIL   Вверх
jonie
Дата 12.10.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



kinder999, ну используя например WCF RIA Services достаточно легко
Я добавил видео на http://vimeo.com/15766620 .Одно но, я ошибся и написал set для поля Key. Этого не нужно, т.к. linq2sql будет проставлять тогда 0-ём наше поле Id.

NOTE:
Ну и получился не совсем удачный пример, т.к. у нас ключ будет один и тот же, поэтому в интерфейсе отобразится только одна запись (по сути distinct записей произойдет), хотя на клиента прокачается 2-е записи (это свойство DomainDatasource делать дистинкт по ключу)
Хранимка такая:
Код

CREATE PROC usp_SelectSome(@id INT)
AS
SELECT * FROM(
    SELECT 1 AS id, 'dt1' AS DATA
    UNION all
    SELECT 1 AS id, 'dt2' AS DATA
    UNION all
    SELECT 2 AS id, 'dt3' AS DATA
    UNION all
    SELECT 3 AS id, 'dt4' AS DATA
)T WHERE t.id = @id  --вот из-за этого DomainDataSource не сможет распознать уникальность


Это сообщение отредактировал(а) jonie - 12.10.2010, 13:10


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kinder999
Дата 12.10.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Блин, чё-то не получается....

Если запускать через Database output:
Код

Running [dbo].[ShowTest] ( @idS = 12 ).

ID     groupA groupQ 
------ ------ ------ 
71     0      1      
72     0      1      
74     0      2      
78     0      2      
76     0      2      
82     0      3      
No rows affected.
(6 row(s) returned)
@RETURN_VALUE = 0
Finished running [dbo].[ShowTest].



Пробую в Wcf SErvice создать функцию, но у меня в Linq to sql не добавляется класс моей процедуры, хотя она добавлена в него
user posted image

в свойствах стоит Return Type: (None)

текст самой процедуры писал не я, но мне приходится с ней работать:
Код


-- =============================================
-- Author:              <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[ShowTest]
        -- Add the parameters for the stored procedure here
        @idS int
AS
BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
   DECLARE @idT int;
   DECLARE @ii int;
   DECLARE @jj int;
   DECLARE @list varchar(MAX);
   DECLARE @lq int;
   DECLARE @qg int;
    -- Insert statements for procedure here
   IF OBJECT_ID (N'#FTest',N'U') IS NOT NULL
      DROP TABLE #FTest
   CREATE TABLE #FTest(ID int, groupA int, groupQ int)
   SET @ii = 1
   SET @jj = 1
   SET @idT = (SELECT IDt FROM [eLearning].[dbo].[Test_summary] WHERE ID = @idS)
   SET @list = ',' +(SELECT ListQ FROM [eLearning].[dbo].[Test_summary] WHERE IDt = @idT) + ',' -- готовим список вопросов к обработке
   SET @lq = (SELECT MAX(ID) FROM [eLearning].[dbo].[Question] WHERE @list LIKE '%,' + cast(ID as varchar) + ',%') -- номер последнего вопроса
   SET @qg = (SELECT groupQ from [eLearning].[dbo].[Question] WHERE ID = @lq) -- количество групп
   IF (SELECT RandQ FROM [eLearning].[dbo].[Test_summary] WHERE IDt = @idT) <> 0 -- проверка флажка "случайный порядок вопросов"
      IF (SELECT LEN(GroupQ) FROM [eLearning].[dbo].[Test_summary] WHERE IDt = @idT) > 0 -- если порядок вопросов случаен и их нужно разбить на группы
         BEGIN
         WHILE @ii<=@qg BEGIN
            IF (SELECT IsBindQ FROM [eLearning].[dbo].[Test_summary] WHERE IDt = @idT) <> 0 BEGIN -- если есть обязательные вопросы
              INSERT INTO #FTest SELECT ID, groupA, groupQ FROM [eLearning].[dbo].[Question] WHERE @list LIKE '%,' + cast(ID as varchar) + ',%' AND groupQ = @ii AND bindQ = 1 ORDER BY newid() 
              INSERT INTO #FTest SELECT TOP (SELECT CAST (SUBSTRING(GroupQ,@jj,1) as int) FROM [eLearning].[dbo].[Test_summary] WHERE IDt=@idT) ID, groupA, groupQ FROM [eLearning].[dbo].[Question] WHERE @list LIKE '%,' + cast(ID as varchar) + ',%' AND groupQ = @ii AND bindQ = 0 ORDER BY newid()
            END
            INSERT INTO #FTest SELECT TOP (SELECT CAST (SUBSTRING(GroupQ,@jj,1) as int)  FROM [eLearning].[dbo].[Test_summary] WHERE IDt=@idT) ID, groupA, groupQ FROM [eLearning].[dbo].[Question] WHERE @list LIKE '%,' + cast(ID as varchar) + ',%' AND groupQ = @ii ORDER BY newid()
            SET @ii = @ii+1
            SET @jj = @jj+2
            END
         END
      ELSE INSERT INTO #FTest SELECT ID, groupA, groupQ FROM [eLearning].[dbo].[Question] WHERE @list LIKE '%,' + cast(ID as varchar) + ',%' ORDER BY newid() -- если порядок вопросов случаен
   ELSE 
      IF (SELECT LEN(GroupQ) FROM [eLearning].[dbo].[Test_summary] WHERE IDt = @idT) > 0 -- если порядок вопросов таков, как задано в БД, и нужно разбить вопросы по группам
         BEGIN
         WHILE @ii<=@qg BEGIN
             IF (SELECT IsBindQ FROM [eLearning].[dbo].[Test_summary] WHERE IDt = @idT) <> 0 BEGIN -- если есть обязательные вопросы
              INSERT INTO #FTest SELECT ID, groupA, groupQ FROM [eLearning].[dbo].[Question] WHERE @list LIKE '%,' + cast(ID as varchar) + ',%' AND groupQ = @ii AND bindQ = 1 
              INSERT INTO #FTest SELECT TOP (SELECT CAST(SUBSTRING(GroupQ,@jj,1) AS int) FROM [eLearning].[dbo].[Test_summary] WHERE IDt=@idT) ID, groupA, groupQ FROM [eLearning].[dbo].[Question] WHERE @list LIKE '%,' + cast(ID as varchar) + ',%' AND groupQ = @ii AND bindQ = 0
            END
            INSERT INTO #FTest SELECT TOP (SELECT CAST(SUBSTRING(GroupQ,@jj,1) AS int) FROM [eLearning].[dbo].[Test_summary] WHERE IDt=@idT) ID, groupA, groupQ FROM [eLearning].[dbo].[Question] WHERE @list LIKE '%,' + cast(ID as varchar) + ',%' AND groupQ = @ii
            SET @ii = @ii+1
            SET @jj = @jj+2
            END
         END
      ELSE
         INSERT INTO #FTest SELECT ID, groupA, groupQ FROM [eLearning].[dbo].[Question] WHERE @list LIKE '%,' + cast(ID as varchar) + ',%' -- если порядок вопросов таков, как задано в БД
      END
    SELECT * FROM #FTest;
--END



на выходе получается таблица, мне из неё надо взять данные в WCF Service...
Второй день никак не могу понять, как это сделать  smile 

Это сообщение отредактировал(а) kinder999 - 12.10.2010, 15:22
PM MAIL   Вверх
jonie
Дата 12.10.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



ну у вас просто сложный результат и автоматически его прожевать SQLMetal не может. Вам надо руками добавить тип в окошко слева, указать поля и типы полей (а также ограничения) и  руками опять же указать тип результата (вписать прямо). И всё будет.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kinder999
Дата 12.10.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Создал в Linq to SQL designer класс
Код

[DataContract()]
public partial class ShowTest
    {
        private int _ID;
        private int _groupA;
        private int _groupQ;

        public ShowTest()
        {
 
        }

        public int ID
        {
            get { return _ID; }
            set
            {
                if ((this._ID != value))
                {
                    this._ID = value;
                }
            }
        }

        public int groupA
        {
            get { return _groupA; }
            set
            {
                if ((this._groupA != value))
                {
                    this._groupA = value;
                }
            }
        }

        public int groupQ
        {
            get { return _groupQ; }
            set
            {
                if ((this._groupQ != value))
                {
                    this._groupQ = value;
                }
            }
        }


    }


в WCF пишу:
Код

#region GetQList(testID)
        [OperationContract]
        IQueryable<ShowTest> GetQList(int testID)
        {
            DCDataContext db = new DCDataContext();

            var result = db.ShowTest(testID);

            return result;

        }
        #endregion

выдаётся ошибка
Код

Cannot implicitly convert type 'int' to 'System.Linq.IQueryable<TestSL.Web.ShowTest>'


Метода AsQueryable() почему-то нету...

Это сообщение отредактировал(а) kinder999 - 12.10.2010, 15:59
PM MAIL   Вверх
kinder999
Дата 12.10.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос решён:
в Linq to SQL designer изменил стандартную функцию, которую создала VS
Код

[Function(Name="dbo.ShowTest")]
        public int ShowTest([Parameter(DbType="Int")] System.Nullable<int> idS)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), idS);
            return ((int)(result.ReturnValue));
        }


на 
Код

[Function(Name = "dbo.ShowTest")]
        public ISingleResult<ShowTest> ShowTest(System.Nullable<int> idS)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), idS);
            return ((ISingleResult<ShowTest>)(result.ReturnValue));
        }

как в примере http://msdn.microsoft.com/ru-ru/library/bb386975(VS.90).aspx
PM MAIL   Вверх
Любитель
Дата 13.10.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



И зря. Лучше было dbml править. Так как твои изменения в дизайнер-файле затрутся при правке дбмл-я.


--------------------
PM MAIL ICQ Skype   Вверх
kinder999
Дата 14.10.2010, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Любитель @  13.10.2010,  16:43 Найти цитируемый пост)
И зря. Лучше было dbml править. Так как твои изменения в дизайнер-файле затрутся при правке дбмл-я. 

хорошо, скажите, пожалуйста, как его поправить?

И ещё вопрос:
У меня в переменную передаётся таблица.
Когда я пытаюсь разбить по столбцам из массивов:
Код

IEnumerable<ShowTest> DataFromDB;
int[] idQ;
int[] groupA;

DataFromDB = db.ShowTest(testID);

idQ = DataFromDB.Select(data => data.ID).ToArray();
groupA = DataFromDB.Select(data => data.groupA).ToArray();


У меня выскакивает:
Код

Не удается перечислить результаты запроса более одного раза.


Подскажите, пожалуйста, как более грамотно вытащить данные из таблицы, если у меня есть класс 
Код

[DataContract]
    public class ListQData
    {
        private List<int> _IDQ = new List<int>();        
        private Dictionary<int, int> _groupA = new Dictionary<int, int>();        
        private Dictionary<int, int> _groupQ = new Dictionary<int, int>();

        
        [DataMember]
        public List<int> IDQ
        {
            get { return _IDQ; }
            set { _IDQ = value; }
        }
       
        [DataMember]
        public Dictionary<int, int> groupA
        {
            get { return _groupA; }
            set { _groupA = value; }
        }
       
        [DataMember]
        public Dictionary<int, int> groupQ
        {
            get { return _groupQ; }
            set { _groupQ = value; }
        }
    }

И мне надо в экземпляр класса внести данные из таблицы.
Получаемая таблица имеет вид:
Код

Running [dbo].[ShowTest] ( @idS = 12 ).
ID     groupA groupQ 
------ ------ ------ 
71     0      1      
72     0      1      
74     0      2      
78     0      2      
76     0      2      
82     0      3      
No rows affected.
(6 row(s) returned)
@RETURN_VALUE = 0
Finished running [dbo].[ShowTest].


Заранее спасибо за ответы.
PM MAIL   Вверх
Любитель
Дата 15.10.2010, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(kinder999 @  14.10.2010,  14:10 Найти цитируемый пост)
хорошо, скажите, пожалуйста, как его поправить?

Можно в дизайнере создать нужный класс и выбрать его как результирующий тип процедуры. Можно открыть дбмл как XML и вписать ElementType.

Цитата(kinder999 @  14.10.2010,  14:10 Найти цитируемый пост)
Не удается перечислить результаты запроса более одного раза.

Форсируй запрос сразу (ToArray/ToList). Затем используй in memory коллекцию.

Цитата(kinder999 @  14.10.2010,  14:10 Найти цитируемый пост)
Подскажите, пожалуйста, как более грамотно вытащить данные из таблицы, если у меня есть класс 

Как-то неочевидно. В структуре класса у тебя дикшенри (которые напрямую L2SQL непромаппит). Сделай запрос, а потом (через Linq to Objects) преобразуй в нужную структуру (только начале определись, что там как преобразовывать надо вообще).

Это сообщение отредактировал(а) Любитель - 15.10.2010, 20:31


--------------------
PM MAIL ICQ Skype   Вверх
kinder999
Дата 16.10.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Любитель, спасибо. Всё заработало!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




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


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

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