🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: alt.pl.comp.lang.csharp
9 messages
9 total messages Started by Pr0NET Thu, 26 Nov 2009 19:21
Procki w MVC 1.0 i LINQ
#21190
Author: Pr0NET
Date: Thu, 26 Nov 2009 19:21
23 lines
1633 bytes
Witam, potrzebują małego helpa. Dopiero zacząłem zabawę z .NET i od
razu trafiłem na MVC i w dodatku muszę używać LINQ. Potrzebuję małego
przykładu jak używać procek w MVC.

Załóżmy, że mam taką:
ALTER PROCEDURE [dbo].[BookDetail]
@BookID INT OUTPUT

AS
SET NOCOUNT ON;
SELECT
     --[BookID]
       [Title]
      ,[TitlelsOrginalNames]
      ,[EventDate]
      ,[Description]
      ,[HostedBy]
      ,[Country]
      ,[PublishYears]
FROM Books
       WHERE BookID = @BookID

Co powinienem dodać w kontrolerze, modelu i widoku by jej użyć?
Re: Procki w MVC 1.0 i LINQ
#21191
Author: Łukasz Kuryło
Date: Thu, 26 Nov 2009 22:16
24 lines
2433 bytes
On 26 Lis, 20:21, Pr0NET <bol...@gmail.com> wrote:
> Witam, potrzebują małego helpa. Dopiero zacząłem zabawę z .NET i od
> razu trafiłem na MVC i w dodatku muszę używać LINQ. Potrzebuję małego
> przykładu jak używać procek w MVC.
>

W MVC używa się procedur składowanych tak samo jak w WebForm'am, WPF
czy gdziekolwiek indziej, gdyż jest to tylko warstwa prezentacji. Mam
nadzieję, że nie chcesz od razu łączyć warstwy prezentacji i dostępu
do danych.
Co do użycia, to zobacz na blogu Scott Guthrie. Swego czasu popełnił
niezłą serię nt. Linq to SQL

http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

> Co powinienem dodać w kontrolerze, modelu i widoku by jej użyć?

Dokładnie opisane przykłady możesz znaleźć na stronce aspa w dziale
Learn
http://www.asp.net/mvc/learn/

Zobacz sobie filmik Stephena Waltera, akurat w VB pokazuje, ale
wyjaśnia podstawy:
http://www.asp.net/learn/mvc-videos/video-403.aspx
Re: Procki w MVC 1.0 i LINQ
#21192
Author: Łukasz Kuryło
Date: Thu, 26 Nov 2009 22:40
8 lines
1882 bytes
> W MVC używa się procedur składowanych tak samo jak w WebForm'am, WPF
> czy gdziekolwiek indziej, gdyż jest to tylko warstwa prezentacji.

Z nazwaniem MVC ogólnie warstwą prezentacji chyba trochę przesadziłem.
Normalnie wydzielam sobie domain model do osobnego projektu, a potem
łączę go z warstwą prezentacji, w tym wypadku z widokami z MVC poprzez
kontrolery.
Re: Procki w MVC 1.0 i LINQ
#21193
Author: Pr0NET
Date: Wed, 02 Dec 2009 23:11
29 lines
2449 bytes
On Nov 26, 11:40 pm, Łukasz Kuryło <lsz...@gmail.com> wrote:
> > W MVC używa się procedur składowanych tak samo jak w WebForm'am, WPF
> > czy gdziekolwiek indziej, gdyż jest to tylko warstwa prezentacji.
>
> Z nazwaniem MVC ogólnie warstwą prezentacji chyba trochę przesadziłem.
> Normalnie wydzielam sobie domain model do osobnego projektu, a potem
> łączę go z warstwą prezentacji, w tym wypadku z widokami z MVC poprzez
> kontrolery.

Dzięki!

Doszedłem do czegoś takiego:

            public IQueryable<Book> Pokaz(int bookID)
            {
                int ? outputParameter = bookID;
               // bookID = 1;
                return from bookdetail in db.BookDetail(ref
outputParameter)
                       select db.BookDetail;
            }

na select mam monit:
Error	2	The type of the expression in the select clause is incorrect.
Type inference failed in the call to 'Select'.	F:\Documents\Visual
Studio 2008\Projects\book_014\TestBook\Models\BookRepository.cs

Wiesz może jak to obejść? Próbowałem już select
db.BookDetail.AsQueryable(); ale coś nie działa.
Re: Procki w MVC 1.0 i LINQ
#21194
Author: Łukasz Kuryło
Date: Thu, 03 Dec 2009 18:47
34 lines
2647 bytes
>             public IQueryable<Book> Pokaz(int bookID)
>             {
>                 int ? outputParameter = bookID;
>                // bookID = 1;
>                 return from bookdetail in db.BookDetail(ref
> outputParameter)
>                        select db.BookDetail;
>             }

return from b in db.BookDetail
where b.bookID==bookID
select b //albo new <jakis obiekt> i mapujesz do niego obiekt book
pobrany przez linq


> Wiesz może jak to obejść? Próbowałem już select
> db.BookDetail.AsQueryable(); ale coś nie działa.

A skoro pobierasz tylko jedną książkę (bo zakładam, że bookID jest
unikalny), to iqueryable jest zbędne. Oczywiście zależy to od Twojego
sposobu pracy. Ja po prostu zwracam jeden konkretny obiekt. W moim
kodzie ta metoda wyglądałaby tak:

 public Book Pokaz(int bookID)
             {
var result=from b in db.BookDetail
where b.bookID==bookID
select new Book{
 bookID=b.bookID //i reszte
};

return result.FirstOrDefault();
             }
Re: Procki w MVC 1.0 i LINQ
#21195
Author: Łukasz Kuryło
Date: Thu, 03 Dec 2009 19:11
47 lines
3460 bytes
> Doszedłem do czegoś takiego:
>
>             public IQueryable<Book> Pokaz(int bookID)
>             {
>                 int ? outputParameter = bookID;
>                // bookID = 1;
>                 return from bookdetail in db.BookDetail(ref
> outputParameter)
>                        select db.BookDetail;
>             }

Zapomniałem się, że piszmy tutaj o procedurach i wyskrobałem wcześniej
inny post. Pewnie się już rozszedł. Nvm.
Wracając do tematu, troche mnie ta nazwa myli. Przez ten ref
przekazujesz parametr do procedury? To jest on tam zbędny.
Aby wywołać procedurę, która zwróci Ci te dane, powinno to wyglądać
mniej więcej tak:

             public IQueryable<Book> Pokaz(int bookID)
             {
                 var result = db.BookDetail(bookID);
                 //...
             }

Teraz co do danych wyjściowych. Wynik otrzymasz w obiekcie, który
nazywa się tak samo, jak Twoja procedura z dodanym na końcu słowem
Result. W tym wypadku będzie to BookDetailResult wsadzona jeszcze w
obiekt ISingleResult. Aby zwrócić to coś jako Book z metody, trzeba to
zmapować. Przykładowo:

        public IQueryable<Book> Pokaz(int bookID)
             {
                 var result = db.BookDetail(bookID);
                 Book b;
                 foreach(var i in result){
b=new Book(){
bookID=i.bookID //i reszte
};
}

return result.asIQueryable();
             }

Zakładam, że ta procedura zwraca tylko jeden rekord, więc ten foreach
jest zbędny, ale to tylko przykład poglądowy. Podobnie ten IQueryable
jako typ zwracany. Ja bym to zwrócił po prostu jako jeden obiekt.
Re: Procki w MVC 1.0 i LINQ
#21196
Author: Pr0NET
Date: Tue, 08 Dec 2009 21:58
48 lines
3461 bytes
Wrzuciłem i jeszcze coś tam sypie przy kompilacji.


Kod obecnie:

            public IEnumerable<Book> Pokaz(int BookID)
            {
                var result = db.BookDetail(BookID);
                Book b;
                foreach (var i in result)
                {
                    b = new Book()
                    {
                          Title = i.Title,
                          TitlelsOrginalNames = i.TitlelsOrginalNames,
                          EventDate = i.EventDate,
                          Description = i.Description,
                          HostedBy = i.HostedBy,
                          PublishYears = i.PublishYears
                    };
                    return result.AsEnumerable();
                }
            }


Teraz kompilator sypie inne błędy:

Error	1	The best overloaded method match for
'NerdBook.Models.NerdBookDataContext.BookDetail(ref int?)' has some
invalid arguments	F:\Documents\Visual Studio 2008\Projects
\book_014\NerdBook\Models\BookRepository.cs	26	30	NerdBook
Error	4	Metadata file 'F:\Documents\Visual Studio 2008\Projects
\book_014\NerdBook\bin\NerdBook.dll' could not be found	NerdBook.Tests
Error	3	Cannot implicitly convert type
'System.Collections.Generic.IEnumerable<NerdBook.Models.BookDetailResult>'
to 'System.Collections.Generic.IEnumerable<NerdBook.Models.Book>'. An
explicit conversion exists (are you missing a cast?)	F:\Documents
\Visual Studio 2008\Projects\book_014\NerdBook\Models
\BookRepository.cs	39	28	NerdBook
Error	2	Argument '1': cannot convert from 'int' to 'ref int?'	F:
\Documents\Visual Studio 2008\Projects\book_014\NerdBook\Models
\BookRepository.cs	26	44	NerdBook


Rezultatu nie mogę zwrócić bo w procedurze nie ma SELECT * a selectuję
wybrane wartości tabeli (nie wszystkie), nie wiem jak to obejść.
Dodatkowo var result potrzebuje referencje do przepisania w sumie nie
mam pojęcia co tam nie gra.
Re: Procki w MVC 1.0 i LINQ
#21197
Author: Łukasz Kuryło
Date: Fri, 11 Dec 2009 14:00
72 lines
4018 bytes
> Rezultatu nie mogê zwróciæ bo w procedurze nie ma SELECT * a selectujê
> wybrane warto¶ci tabeli (nie wszystkie), nie wiem jak to obej¶æ.
> Dodatkowo var result potrzebuje referencje do przepisania w sumie nie
> mam pojêcia co tam nie gra.

Odpowiadając poprzednio nie spojrzałem do pierwszego Twojego postu.
Jeżeli rozmawiamy o tej procedurze:

ALTER PROCEDURE [dbo].[BookDetail]
@BookID INT OUTPUT

AS
SET NOCOUNT ON;
SELECT
     --[BookID]
       [Title]
      ,[TitlelsOrginalNames]
      ,[EventDate]
      ,[Description]
      ,[HostedBy]
      ,[Country]
      ,[PublishYears]
FROM Books
       WHERE BookID = @BookID

to moim zdaniem, to słówko output jest zbyteczne. Wystarczy
odkomentować pierwszą linijkę z selecta i później odpowiednio "dobrać"
się do zwróconego Id. Zaznaczyć również tutaj muszę, że w tym wypadku,
jeżeli chcesz również przez ten parametr przekazać nr id dotyczące
odpowiedniej książki, której info chcesz pobrać ( WHERE BookID =
@BookID ), to tak nie przejdzie, chyba że ja czegoś nie wiem. IMO
drugi parametr by trzeba dodać. Jednakże, jeżeli ta procedura
wyglądałaby tak:

ALTER PROCEDURE [dbo].[BookDetail]
@BookID INT,
@BookID INT OUTPUT

czyli w pierwszym parametrze przekazujesz id książki by pobrać jej
dane, to nielogiczne jest później ten id zwracać z tej procedury,
skoro już go masz w przekazanej zmiennej. Wydaje mi się, że po prostu
nie zrozumiałeś, do czego się stosuje słówko output.

Jeżeli z tej procki usuniesz to słowo, to kod, który podałem w
poprzednim moim poście powinien zadziałać poprawnie.

Co do słówka output, zobacz taki z dupy wzięty przykład:

create procedure TestProc(
	@result int output
)
as
begin
	set  @result =  2+2
end
go
declare @res int
exec TestProc @res output
select @res

Na tym można prześledzić, jak to działa.
Z poziomu L2S można takiej procki użyć następująco:

        public void GetTheSum()
        {
            int? result=null;
            int a;
            a=MyDataContext.TestProc(ref result);
        }

Teraz w result masz ten wynik.
Re: Procki w MVC 1.0 i LINQ
#21198
Author: Pr0NET
Date: Sun, 13 Dec 2009 23:17
74 lines
4053 bytes
On Dec 11, 3:00 pm, Łukasz Kuryło <lsz...@gmail.com> wrote:
> > Rezultatu nie mogê zwróciæ bo w procedurze nie ma SELECT * a selectujê
> > wybrane warto¶ci tabeli (nie wszystkie), nie wiem jak to obej¶æ.
> > Dodatkowo var result potrzebuje referencje do przepisania w sumie nie
> > mam pojêcia co tam nie gra.
>
> Odpowiadając poprzednio nie spojrzałem do pierwszego Twojego postu.
> Jeżeli rozmawiamy o tej procedurze:
>
> ALTER PROCEDURE [dbo].[BookDetail]
> @BookID INT OUTPUT
>
> AS
> SET NOCOUNT ON;
> SELECT
>      --[BookID]
>        [Title]
>       ,[TitlelsOrginalNames]
>       ,[EventDate]
>       ,[Description]
>       ,[HostedBy]
>       ,[Country]
>       ,[PublishYears]
> FROM Books
>        WHERE BookID = @BookID
>
> to moim zdaniem, to słówko output jest zbyteczne. Wystarczy
> odkomentować pierwszą linijkę z selecta i później odpowiednio "dobrać"
> się do zwróconego Id. Zaznaczyć również tutaj muszę, że w tym wypadku,
> jeżeli chcesz również przez ten parametr przekazać nr id dotyczące
> odpowiedniej książki, której info chcesz pobrać ( WHERE BookID =
> @BookID ), to tak nie przejdzie, chyba że ja czegoś nie wiem. IMO
> drugi parametr by trzeba dodać. Jednakże, jeżeli ta procedura
> wyglądałaby tak:
>
> ALTER PROCEDURE [dbo].[BookDetail]
> @BookID INT,
> @BookID INT OUTPUT
>
> czyli w pierwszym parametrze przekazujesz id książki by pobrać jej
> dane, to nielogiczne jest później ten id zwracać z tej procedury,
> skoro już go masz w przekazanej zmiennej. Wydaje mi się, że po prostu
> nie zrozumiałeś, do czego się stosuje słówko output.
>
> Jeżeli z tej procki usuniesz to słowo, to kod, który podałem w
> poprzednim moim poście powinien zadziałać poprawnie.
>
> Co do słówka output, zobacz taki z dupy wzięty przykład:
>
> create procedure TestProc(
>         @result int output
> )
> as
> begin
>         set  @result =  2+2
> end
> go
> declare @res int
> exec TestProc @res output
> select @res
>
> Na tym można prześledzić, jak to działa.
> Z poziomu L2S można takiej procki użyć następująco:
>
>         public void GetTheSum()
>         {
>             int? result=null;
>             int a;
>             a=MyDataContext.TestProc(ref result);
>         }
>
> Teraz w result masz ten wynik.

Dzięki :).
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads