none
Stored Procedure`den Tablo olarak veri alma RRS feed

  • Soru

  • Arkadaşlar merhaba

    benim aşağıdaki gibi bir stored procedurem var.

    ALTER PROCEDURE ProcTeminIstatistik
    @TeminKodu as NVARCHAR(8)
    AS
    BEGIN
    SET NOCOUNT ON
    Declare @FirmalarCount as int
    Declare @FirmaKod as int
    Declare @cols as NVARCHAR(MAX)
    Declare @query As NVARCHAR(MAX)
    Set @FirmaKod=0
    Select @FirmalarCount=Count(Distinct FirmaKodu) From Teklifler Where TeminKodu=  @TeminKodu 
    Select @cols = STUFF((SELECT distinct ',' +
                            QUOTENAME(FirmaKodu)
                          FROM Teklifler Where TeminKodu=@TeminKodu 
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                            , 1, 1, '') 
    SET @query  ='Select T.TasinirAdi,'
    WHILE @FirmalarCount>0
    BEGIN
    	IF @FirmalarCount=1
    	BEGIN
    	SET @query =  @query+ 'Sum(ISNULL(CASE WHEN T.FirmaKodu = ' + Char(39) + SUBSTRING(@cols,@FirmaKod+2,8) + Char(39) + ' THEN T.YaklasikAlinanFiyat END,0)) AS '+  SUBSTRING(@cols,@FirmaKod+2,8) + 'YMAlinanFiyat,Sum(ISNULL(CASE WHEN T.FirmaKodu = ' + Char(39) + SUBSTRING(@cols,@FirmaKod+2,8) + Char(39) + ' THEN T.TeminBirimFiyat END,0)) AS '+  SUBSTRING(@cols,@FirmaKod+2,8) + 'YMTeminFiyat'
        End 
        
        IF NOT @FirmalarCount=1
        Begin
    	SET @query =  @query+ 'Sum(ISNULL(CASE WHEN T.FirmaKodu = ' + Char(39) + SUBSTRING(@cols,@FirmaKod+2,8) + Char(39) + ' THEN T.YaklasikAlinanFiyat END,0)) AS '+  SUBSTRING(@cols,@FirmaKod+2,8) + 'YMAlinanFiyat,Sum(ISNULL(CASE WHEN T.FirmaKodu = ' + Char(39) + SUBSTRING(@cols,@FirmaKod+2,8) + Char(39) + ' THEN T.TeminBirimFiyat END,0)) AS '+  SUBSTRING(@cols,@FirmaKod+2,8) + 'YMTeminFiyat' + ','
        End
        SET  @FirmalarCount = @FirmalarCount-1
        Set @FirmaKod=@FirmaKod+11
    END
    Set @query= @query + ' from Teklifler T Where TeminKodu= ' + Char(39) +@TeminKodu  + Char(39) +' Group by T.TasinirAdi'
    Exec sp_executesql @query, N'@TeminKodu nvarchar(8)', @TeminKodu = @TeminKodu
    END

    Bu procedureyi sql tarafından sorgulattığımda tablo olarak çıktı alıyorum ancak vb.net tarafından almaya çalıştığımda boş dönüyor.Bu sorunun nedeni ne olabilir yardımcı olabilirseniz sevinirim.

    14 Aralık 2013 Cumartesi 08:10

Yanıtlar

  • Hayır direk Sql'de aldığınız sonucu getirir size. DataAdapter kullanmanız faydalı olur. 

    Internette VB.Net için stored procedure kullanımına örnek olarak şunu buldum. Aşağıdaki örneği inceleyerek kendinize göre düzenleyip denermisiniz ? 

    Dim CN As New SqlConnection("Integrated Security=SSPI;Initial Catalog=Okul;Data Source=.\SQLEXPRESS")
    CN.Open()
    Dim CMD As SqlCommand = New SqlCommand("S_OgrenciKayit", CN)
        'SqlCommand nesnesi varsayilan olarak CommandtType.Text olarak gelir; bunu CommandType.StoredProcedure olarak degistiriyoruz:
    CMD.CommandType = CommandType.StoredProcedure
        'DataAdapter vasitasiyla DataTable'yi dolduruyoruz ve Grid'e bagliyoruz:
        Dim DA As SqlDataAdapter = New SqlDataAdapter(CMD)
        Dim DT As DataTable = New DataTable
    DA.Fill(DT)
    DataGridView1.DataSource = DT
    CN.Close()


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Iletişim: barissaritas[at]windowslive[nokta]com

    • Yanıt Olarak İşaretleyen Marty McFly15 14 Aralık 2013 Cumartesi 15:34
    14 Aralık 2013 Cumartesi 09:04
  • Barış bey yine olmadı.

      BaglantiKur()
            SqlCom.CommandText = "ProcTeminIstatistik"
            SqlCom.CommandType = CommandType.StoredProcedure
            SqlCom.Connection = Conn
            SqlCom.Parameters.AddWithValue("@TeminKodu", AnaMenu.LblIsKod.Text)
            Adap = New SqlClient.SqlDataAdapter(SqlCom)
            Dim TableDa As New DataTable
            Adap.Fill(TableDa)
            DataGridView1.DataSource = TableDa
            Conn.Close()

    kodlayla denedim ancak yine bir sonuç yok.2 Kez aynı işlemi yaptığımda şu hatayı verdi.

    Procedure or function ProcTeminIstatistik has too many arguments specified.

    • Yanıt Olarak İşaretleyen Marty McFly15 14 Aralık 2013 Cumartesi 15:34
    14 Aralık 2013 Cumartesi 09:15
  • Parametreni şöyle eklermisin ?

    Dim prm As New SqlParameter
        prm.ParameterName = "@TeminKodu"
        prm.SqlDbType = SqlDbType.NVarChar
        prm.Size = 30
        prm.Direction = ParameterDirection.Input
        prm.Value = AnaMenu.LblIsKod.Text
        //DataAdapter'a parametre ekliyoruz.
        dap.SelecCommand.Parameters.Add(prm)


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Iletişim: barissaritas[at]windowslive[nokta]com

    • Yanıt Olarak İşaretleyen Marty McFly15 14 Aralık 2013 Cumartesi 15:34
    14 Aralık 2013 Cumartesi 09:17

Tüm Yanıtlar

  • VB tarafından parametre gönderiyormusunuz ? VB kodlarınızıda görebilirmiyiz ?

    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Iletişim: barissaritas[at]windowslive[nokta]com

    14 Aralık 2013 Cumartesi 08:26
  •         BaglantiKur()
            SqlCom = New SqlClient.SqlCommand("ProcTeminIstatistik", Conn)
            SqlCom.CommandType = CommandType.StoredProcedure
            SqlCom.Parameters.Add("@TeminKodu", SqlDbType.VarChar)
            SqlCom.Parameters("@TeminKodu").Value = AnaMenu.LblIsKod.Text
            SqlCom.Connection.Open()
            DataGridView1.DataSource = SqlCom.ExecuteNonQuery
            SqlCom.Connection.Close()
    Vb.net kodlarım yukarıda. Aşağıdaki 2 sorgu şeklinle denedim ancak bir türlü verileri çekemedim datagridview kontrolüne.

    ExecuteNonQuery

    ExecuteReader

    14 Aralık 2013 Cumartesi 08:34
  • SqlDataAdapter kullanarak yapsanız daha iyi olmazmı ? DataTable'a aktarsanız verileri.  GridVew'ın dataSource'unu DataTable olarak gösterseniz sanırım işinizi görür.

    Yani Şöyle (C# olarak yazıyorum.)

    BaglantiKur();
    SqlDataAdapter dap = new SqlDataAdapter("ProcTeminIstatistik",Conn);
    dap.SelectCommand.CommandType= CommandType.StoredProcedure;
    dap.SelectCommand.Parameters.AddWithValue("@TeminKodu",AnaMenu.LblIsKod.Text);
    DataTable dt = new DataTable();
    dap.Fill(dt);
    DataGridView1.DataSource =dt;


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Iletişim: barissaritas[at]windowslive[nokta]com

    14 Aralık 2013 Cumartesi 08:45
  • Barış bey;

    Öneriniz için teşekkür ederim ancak denedim yinede bir veri alamadım.Sanırım sql tarafındaki kodumda ufak bir hata var.sql tarafında yaptığımda çıktı alabiliyorum tablo olarak ancak vbnette datagridview`a aktarmıyor.Vb.net`e farklı şeklide aktarıyor olabilir mi?

    14 Aralık 2013 Cumartesi 08:59
  • Hayır direk Sql'de aldığınız sonucu getirir size. DataAdapter kullanmanız faydalı olur. 

    Internette VB.Net için stored procedure kullanımına örnek olarak şunu buldum. Aşağıdaki örneği inceleyerek kendinize göre düzenleyip denermisiniz ? 

    Dim CN As New SqlConnection("Integrated Security=SSPI;Initial Catalog=Okul;Data Source=.\SQLEXPRESS")
    CN.Open()
    Dim CMD As SqlCommand = New SqlCommand("S_OgrenciKayit", CN)
        'SqlCommand nesnesi varsayilan olarak CommandtType.Text olarak gelir; bunu CommandType.StoredProcedure olarak degistiriyoruz:
    CMD.CommandType = CommandType.StoredProcedure
        'DataAdapter vasitasiyla DataTable'yi dolduruyoruz ve Grid'e bagliyoruz:
        Dim DA As SqlDataAdapter = New SqlDataAdapter(CMD)
        Dim DT As DataTable = New DataTable
    DA.Fill(DT)
    DataGridView1.DataSource = DT
    CN.Close()


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Iletişim: barissaritas[at]windowslive[nokta]com

    • Yanıt Olarak İşaretleyen Marty McFly15 14 Aralık 2013 Cumartesi 15:34
    14 Aralık 2013 Cumartesi 09:04
  • Barış bey yine olmadı.

      BaglantiKur()
            SqlCom.CommandText = "ProcTeminIstatistik"
            SqlCom.CommandType = CommandType.StoredProcedure
            SqlCom.Connection = Conn
            SqlCom.Parameters.AddWithValue("@TeminKodu", AnaMenu.LblIsKod.Text)
            Adap = New SqlClient.SqlDataAdapter(SqlCom)
            Dim TableDa As New DataTable
            Adap.Fill(TableDa)
            DataGridView1.DataSource = TableDa
            Conn.Close()

    kodlayla denedim ancak yine bir sonuç yok.2 Kez aynı işlemi yaptığımda şu hatayı verdi.

    Procedure or function ProcTeminIstatistik has too many arguments specified.

    • Yanıt Olarak İşaretleyen Marty McFly15 14 Aralık 2013 Cumartesi 15:34
    14 Aralık 2013 Cumartesi 09:15
  • Parametreni şöyle eklermisin ?

    Dim prm As New SqlParameter
        prm.ParameterName = "@TeminKodu"
        prm.SqlDbType = SqlDbType.NVarChar
        prm.Size = 30
        prm.Direction = ParameterDirection.Input
        prm.Value = AnaMenu.LblIsKod.Text
        //DataAdapter'a parametre ekliyoruz.
        dap.SelecCommand.Parameters.Add(prm)


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Iletişim: barissaritas[at]windowslive[nokta]com

    • Yanıt Olarak İşaretleyen Marty McFly15 14 Aralık 2013 Cumartesi 15:34
    14 Aralık 2013 Cumartesi 09:17