+ Yanıtla
Sayfa Düzeni: 1 / 2
1 2 SonSon
Toplam 17 sonuçtan 1 ile 10 arası olanlar

Konu Başlığı: ASP ile store procedure & birden fazla select

  1. #1

    ASP ile store procedure & birden fazla select

    Merhaba arkadaşlar...

    MSSQL altıdna store procedure ile veri listeleme yapmak istiyorum ancak yaptığım sorguda "if, else" e göre select kullanmam gerekiyor. Aşağıda da store procedure kodunu veriyorum;

    PHP Kodu:
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE 
    [dbo].[USER_LISTS2
        @
    GET_ID bigint,
        @
    SENT_TYPE bigint NULL output,
        @
    SENT_ID bigint NULL output
    AS
    BEGIN
        SELECT 
    @SENT_TYPE LIST_TYPE, @SENT_ID LIST_ID FROM R_USERS_LIST WHERE USER_ID = @GET_ID AND LIST_EXTRA 1 ORDER BY LIST_ID DESC
        
    IF @SENT_TYPE 100
            BEGIN
                SELECT USER_REALNAME
    ,USER_NICK FROM VW_LIST_FRIENDS WHERE LIST_ID = @SENT_ID
            END
        
    ELSE IF (@SENT_TYPE 102)
            
    BEGIN
                SELECT ARTIST_NAME
    ,ARTIST_URL FROM VW_LIST_ARTISTS WHERE LIST_ID = @SENT_ID
            END
    END 
    Ancak ASP içerisinde çalıştırmak istediğimde ;

    PHP Kodu:
    ADODB.Recordset (0x800A0E78)
    Nesne kapalı olduğunda işleme izin verilmez
    hatasını alıyorum, hata aldığım satırda ise "If objProfileLook.Eof Then" yazıyor. Sadece boş mu değil mi kontrol ediyorum.

    Bu sorunu nasıl aşabilirim. Bu konu hakkında bilgisi olan var mı acaba? MutiRecordset gibi birşeyler duydum ancak sanırım istediğim tam olarak o değil.

    Not: Başlığa ne yazacağımı bilemedim bunu uygun gördüm mazur görün..

    Saygılarımla...

  2. #2
    sorgunuzun değer döndürmeme ihtimali var (@SENT_TYPE 100 ve 102 dışında olursa).

    multi select ile işiniz yok,

    SELECT @SENT_TYPE = LIST_TYPE, @SENT_ID = LIST_ID FROM R_USERS_LIST WHERE USER_ID = @GET_ID AND LIST_EXTRA = 1 ORDER BY LIST_ID DESC

    geriye bir select döndermez, sadece değişkenlere veri ataması yapar.

    SP'de anlamadığım bir nokta var, parametre olarak gönderdiğiniz @SENT_TYPE ve @SENT_ID'ye neden henüz hiç kullanmadan veri atıyorsunuz. ya parametre olarak göndermeyin yada SP'içerisinde hiç kullanmadan veri atamayın. bir karmaşa sözkonusu.

    burada, siz @SENT_TYPE'ı 100 gönderseniz dahi SELECT @SENT_TYPE = LIST_TYPE nedeniyle 100 veya 102 den farklı bir değer atanıyorsa SP'niz geriye hiçbir select göndermez. dolayısıyla hatayı alma nedeniniz bu olabilir.
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  3. #3
    Öncelikle cevabınız için teşekkürler.

    Type olarak o değerlerden başka bir değer olmayacağını varsayarsak ne yapmak lazım?

    Aslında tabi ki başka type değerleri olacak ancak onları sp içine henüz yazmadım. 100 den 130 a kadar type var ve hepsi için if else ile yeni bir select oluşturacağım. SP yi konuyu açarken oluşturduğum için tamamen bitiremedim. SP kodunda Alttaki 2 select içerisinde çektiğim verileri değişkenlere atamam gerekiyordu ancak SP içerisine yazmayı unutmuşum.

    Query Analyzer ile SP yi çalıştırdığımda (SP kodunda Print yazarak) sonuç alabiliyorum ancak ASP sayfası içerisinde Nesne kapalı hatası alıyorum.

    SP sorunsuz olsa ASP ile nesne kapalı hatası almadan nasıl çalışabilirim?

  4. #4
    @SENT_TYPE bigint = NULL output,
    @SENT_ID bigint = NULL output

    bunlar neden output? geriye iki değer mi yoksa bir recordset mi almaya çalışıyorsunuz?

    eğer hem değerleri hem de veri setini almak istiyorsanız, bir kola 2 karpuz taşımayın. önce değerlerinizi alın, ona göre veri setinizi alın. kodunuzun karmaşası içinden çıkamayabilirsiniz.

    bir de recordset'i .open ettiğiniz kodu ve query analizer'da çalıştırdığınız kodu ve çıktı örneğini yazarsanız daha kolay yorumlayabilirim.
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  5. #5
    Command ile kullanarak çalıştırabilmiştim bu sebeple output yapmıştım, açıkcası yeni yeni SQL in inceliklerine inmeye başladım. Bir recordset almak tabi ki daha çok işime yarayacaktır.

    Query Analyzer da sadece ;

    PHP Kodu:
    exec SP_ADI 'değer' 
    ile çalıştırıyorum tabi SP'nin içinde "USER_REALNAME, USER_NICK, ARTIST_NAME, ARTIST_URL" değerlerini bir değişkene atadıktan ve PRINT ile sayfaya bastıktan sonra. Çıktı ise PRINT @DEĞİŞKEN_ADI olacaktır tabi, Query Analyzer da da tam olarak istediğimi halledemedim tabi. Ama yinede bir sonuç veriyor.

    Sayfada kullandığım kod ise;

    PHP Kodu:

    Function fncStored(fnObj,fnStored)
        
    Set fnObj conn.Execute(fnStored)
    End Function

    SQL    "USER_LISTS "&strID&""
    Call fncStored(objProfileLook,SQL
    ASP hangi select i alacağını mı bilemiyor, ki mantıken de bunu belirtmek için bir şey yapmak gerekiyor sanırım ama nedir nasıldır anlamış değilim

  6. #6
    ilk olarak, SP kullanıp PRINT edilen değişkeni almak çok avantajlı bir yöntem değil. eğer SP'nin her zaman geriye tek değer dönderecekse, @RETURN_VALUE ya da output ile değer ataması ile parametrelerin değerini almak şeklinde olabilir ancak bu çok kolay değildir, hele yeni başlangıç seviyesinde

    bir başka nokta, her case için farklı veri seti gönderecek bir tek SP de belki db tarafında esneklik sağlar ama, kodu ve algoritmayı kısaltayım derken çok daha karmaşık hale getirebilir. hele hele her case için farklı sayıda alan geri dönderen veri seti ile çalışılıyorsa.

    Kod:
    CREATE PROCEDURE [dbo].[USER_LISTS2] 
        @GET_ID bigint
    AS
    BEGIN
    	DECLARE @SENT_TYPE bigint, @SENT_ID bigint
    	SET @SENT_TYPE = NULL
    	SET @SENT_ID = NULL
        SELECT @SENT_TYPE = LIST_TYPE, @SENT_ID = LIST_ID FROM R_USERS_LIST WHERE USER_ID = @GET_ID AND LIST_EXTRA = 1 ORDER BY LIST_ID DESC
        IF @SENT_TYPE = 100
            BEGIN
                SELECT @SENT_TYPE, @SENT_ID, USER_REALNAME,USER_NICK FROM VW_LIST_FRIENDS WHERE LIST_ID = @SENT_ID
            END
        ELSE IF (@SENT_TYPE = 102)
            BEGIN
                SELECT @SENT_TYPE, @SENT_ID, ARTIST_NAME, ARTIST_URL FROM VW_LIST_ARTISTS WHERE LIST_ID = @SENT_ID
            END
    	ELSE
    		BEGIN
                SELECT 'Uygun veri Bulunamadı', null
            END
    END
    
    SP'nizi bu şekilde düzenleyip çalıştırın bakalım geriye ne değer dönderecek.
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  7. #7
    Çok teşekkürler, evet işe yaradı ve geriye sonuç döndürdü.

    Yalnız veritabanında ki ilk kayıtı aldı sadece. Kayıtları döngüye sokmak istediğim zaman hiç hata vermemesine rağmen "Do Loop" ile döngüye sokamıyorum. Tek bir kayıt döndürüyor.

    Bildiğimiz "Do Loop" döngüsünün dışında bir şey mi kullanmak gerekli yoksa store procedure de bir şey mi yapmalıyız? ASP kodunda değilde sanırım SP içerisinde bir değişiklik yapılmalı. Halbuki SP içerisinde "order by" kullanıp sıralamada yapmıştım.

    Saygılar....

  8. #8
    2 nedeni olabilir,

    1. WHERE LIST_ID = @SENT_ID ile zaten tek kayıt dönüyordur.
    2. ASP tarafında loop'unuzda bir hata vardır.

    Kod:
    while not rs.eof 
    	response.write rs(0) &"<br>"
    	rs.movenext
    wend
    
    ile veri setinin ilk alanlarını yazdırmayı deneyebilirsiniz.
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

  9. #9
    Döngüye sokulması gereken kısım;

    PHP Kodu:
    SELECT @SENT_TYPE LIST_TYPE, @SENT_ID LIST_ID FROM R_USERS_LIST WHERE USER_ID = @GET_ID AND LIST_EXTRA 1 ORDER BY LIST_ID DESC 
    Bu kayıt seti içerisindeki verileri sıralyacak ve verilerin detaylarını alttaki selectten alacak. Yani döngüye sokulması gereken kısım üstteki select ki orada birden fazla veri var. TYPE_ID'ye göre alttaki selectlerden detayları alıyor.

    Saygılar....

  10. #10
    SP içerisinde döngü yapmanız gerekecek, ki SP'ler döngü kullanılmasını pek sevmez

    bunun yanı sıra ilk selectinizde 2 kayıt geldi diyelim, birinden type 100, 2. de 101. ikiside farklı tablolardan veri alıyor, bunları nasıl tek bir select olarak geri döndereceksiniz?

    eğer detayın veri deseni aynı olacaksa tavsiyem, geçici bir tablo oluşturun, üsttekine göre döngünüzü yaratın, detay kayıtlarını geçici tabloya ekleyin, döngü sonunda geçici tabloyu select edin ve geçici tabloyu silin.

    ya da

    Kod:
    SELECT R.LIST_TYPE, R.LIST_ID, F.USER_REALNAME, F.USER_NICK FROM VW_LIST_FRIENDS F, R_USERS_LIST R WHERE R.USER_ID = @GET_ID AND R.LIST_TYPE = 100 AND F.LIST_ID = R.LIST_ID
    UNION ALL
    SELECT R.LIST_TYPE, R.LIST_ID, A.ARTIST_NAME, A.ARTIST_URL FROM VW_LIST_ARTISTS A, R_USERS_LIST R WHERE R.USER_ID = @GET_ID AND R.LIST_TYPE = 102 AND A.LIST_ID = R.LIST_ID
    
    gibi bir select ile UNION yapmanız gerekiyor. ancak dediğim gibi alanların tiplerinin ve sayılarının eşit olduğu durumlarda bu iki seçenek sözkonusu olur.
    "oturduğum mahallenin yolları çamurluydu, boyalı ayakkabı giysem bile, o yollardan geçtikten sonra çamurlanmamaları mümkün değildi. hayatım da böyle." yılmaz güney
    http://www.sipidik.com

+ Yanıtla
Sayfa Düzeni: 1 / 2
1 2 SonSon

Bu konu başlığı için etiketler

Mesaj Seçenekleri

  • Yeni başlık açamazsınız
  • Cevap yazabilirsiniz
  • Dosya ekleyemezsiniz
  • Mesajlarınızı değiştiremezsiniz