2016-04-04 32 views
0

ile SQLCLR saklı yordamlarında oldukça yeniyim. Benim örneğimde, biri parametre olmayan ve bir giriş parametresi olan iki saklı yordamım var. Her ikisi de aynı tabloları hedefler.SQLCLR saklı yordamları giriş parametresi

Parametresiz olanı iyi çalışıyor ve sonuçtaki tüm satırları döndürür. Ancak aynı tabloları hedefleyen bir giriş parametresi olan herhangi bir hata almama rağmen herhangi bir satır döndürmüyor. .NET kodundaki giriş parametresi SqlString olarak ayarlanmış ve veritabanında NVARCHAR(50).

Bu benim C# kodu gibi görünür:

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 

public partial class StoredProcedures 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void AirlineSqlStoredProcedure (SqlString strAirline) 
    { 
     SqlConnection conn = new SqlConnection(); 
     conn.ConnectionString = "Context Connection=true"; 

     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 
     conn.Open(); 
     cmd.CommandText = "SELECT dbo.tblAirline.AirlineName, dbo.tblAircraft.AircraftUnits, dbo.tblAircraft.Manufacturer, dbo.tblAircraft.AircraftModel FROM dbo.tblAircraft INNER JOIN dbo.tblAirline ON dbo.tblAircraft.AirlineID = dbo.tblAirline.AirlineID WHERE AirlineName = '@strAirline' ORDER BY dbo.tblAircraft.AircraftUnits DESC"; 
     SqlParameter paramAge = new SqlParameter(); 
     paramAge.Value = strAirline; 
     paramAge.Direction = ParameterDirection.Input; 
     paramAge.SqlDbType = SqlDbType.NVarChar; 
     paramAge.ParameterName = "@strAirline"; 

     cmd.Parameters.Add(paramAge); 
     SqlDataReader sqldr = cmd.ExecuteReader(); 
     SqlContext.Pipe.Send(sqldr); 

     sqldr.Close(); 
     conn.Close(); 
    } 

    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void AirlineAircraftStoredProcedure() 
    { 
     //It returns rows from Roles table  
     SqlConnection conn = new SqlConnection(); 
     conn.ConnectionString = "Context Connection=true"; 

     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 
     cmd.CommandText = "SELECT dbo.tblAirline.AirlineName, dbo.tblAircraft.AircraftUnits, dbo.tblAircraft.Manufacturer, dbo.tblAircraft.AircraftModel FROM dbo.tblAircraft INNER JOIN dbo.tblAirline ON dbo.tblAircraft.AirlineID = dbo.tblAirline.AirlineID ORDER BY dbo.tblAircraft.AircraftUnits DESC"; 
     conn.Open(); 

     SqlDataReader sqldr = cmd.ExecuteReader(); 
     SqlContext.Pipe.Send(sqldr); 

     sqldr.Close(); 
     conn.Close(); 

    } 
} 

Ve saklı yordam çalıştırdığınızda ben boş satır olsun:

USE [TravelSight] 
GO 

DECLARE @return_value Int 

EXEC @return_value = [dbo].[AirlineSqlStoredProcedure] 
     @strAirline = N'American Airlines' 

SELECT @return_value as 'Return Value' 

GO 

(0 row(s) affected) 

(1 row(s) affected) 

Ayrıca, daha önce bir N koymak giriş parametresinin dize. Yanlış burada ne

USE [TravelSight] 
GO 

DECLARE @return_value Int 

EXEC @return_value = [dbo].[AirlineAircraftStoredProcedure] 

SELECT @return_value as 'Return Value' 

GO 


(8 row(s) affected) 


(1 row(s) affected) 

yapmış:

, ben tüm satırları geri alıyorum aynı tabloları hedefleyen saklı yordam AirlineAircraftStoredProcedure çalıştırırken?

+0

Belki bunlar sadece örneklerdir, fakat olmadıkları takdirde, neden bu CLR saklı yordamları vardır? CLR'nin yerel T-SQL programlarından daha iyi olduğu konusunda hiçbir şey yapmıyor gibi görünmüyor. Öyleyse, hiçbir şeyden faydalanamayacaksın. –

+0

Haklısınız, bu doğru sözdizimini öğrenmek için sadece bir egzersizdi. – user2371684

cevap

0

İki (belki 3) sorunlar:

  1. paramAge.Value = strAirline; olmalıdır:

    paramAge.Value = strAirline.Value;

    Bildirimi .Value özelliğinin kullanılması. (cmd.CommandText = "... içinde)

  2. WHERE AirlineName = '@strAirline' olmalıdır: Tek tırnak sorgu metninde kaldırıldığını

    WHERE AirlineName = @strAirline

    dikkat edin. Parametreler/değişkenler değil, yalnızca hazır bilgi için tek tırnak kullanılır.

  3. aşağıdaki 5 satırları değiştirin:

    SqlParameter paramAge = new SqlParameter(); 
    paramAge.Value = strAirline; 
    paramAge.Direction = ParameterDirection.Input; 
    paramAge.SqlDbType = SqlDbType.NVarChar; 
    paramAge.ParameterName = "@strAirline"; 
    

    ile:

    SqlParameter paramAge = new SqlParameter("@strAirline", SqlDbType.NVarChar, 50); 
    paramAge.Direction = ParameterDirection.Input; // optional as it is the default 
    paramAge.Value = strAirline.Value; 
    

    "boyutu" parametresi new SqlParameter() çağrısında kuruldu unutmayınız. her zaman max string uzunluklarını belirtmek önemlidir. yolumdan teknik sorun ile

, adrese iki büyük sorunları vardır:

    bu ilk etapta SQLCLR yapılıyor Neden
  1. ? .NET'e özgü hiçbir şey yapılmıyor. Sadece soruda yayınlanan kodlara dayanarak, bu düzenli bir T-SQL Saklı Prosedürü olarak çok daha iyi kapalı olacaktır.SqlConnection, SqlCommand ve SqlDataReader: Bu SQLCLR kalması gerekiyorsa

  2. , o zaman gerçekten yani using() olusumların içinde tek kullanımlık nesneleri sarmak gerekir.

    using (SqlConnection conn = new SqlConnection("Context Connection=true")) 
    { 
        using (SqlCommand cmd = conn.CreateCommand()) 
        { 
        ... 
        } 
    } 
    

    ve sonra ihtiyacım yok şu iki satır: Örneğin onların Dispose() yöntemlerin her çağrısıyla örtük çağrılacak olarak

    sqldr.Close(); 
    conn.Close(); 
    

    .

+0

Teşekkürler, bu yardımcı oldu :) Doğru, bu bir clr saklı yordamının uygun bir kullanımı değil, sadece bir egzersiz olarak bunu deniyorum, daha sonra devam edeceğim ve ona bazı iş mantığı ekleyeceğim. Bir kez daha teşekkürler :) – user2371684

İlgili konular