SORU
17 AĞUSTOS 2011, ÇARŞAMBA


C# SQL Server saklı yordam için bir liste Geçen

Benim C den bir SQL Server saklı yordam arıyorum# kod:

using (SqlConnection conn = new SqlConnection(connstring))
{
   conn.Open();
   using (SqlCommand cmd = new SqlCommand("InsertQuerySPROC", conn))
   {
      cmd.CommandType = CommandType.StoredProcedure;

      var STableParameter = cmd.Parameters.AddWithValue("@QueryTable", QueryTable);
      var NDistanceParameter = cmd.Parameters.AddWithValue("@NDistanceThreshold", NDistanceThreshold);
      var RDistanceParameter = cmd.Parameters.AddWithValue(@"RDistanceThreshold", RDistanceThreshold);

      STableParameter .SqlDbType = SqlDbType.Structured;
      NDistanceParameter.SqlDbType = SqlDbType.Int;
      RDistanceParameter.SqlDbType = SqlDbType.Int;

      // Execute the query
      SqlDataReader QueryReader = cmd.ExecuteReader();

Benim saklı proc oldukça standarttır ama QueryTable ile katılın (dolayısıyla bir saklı yordam kullanarak) yapar.

Şimdi: dizeleri listesi, List<string> parametre ayarlamak için eklemek istiyorum. Örneğin, saklı yordam sorguyu şöyle:

SELECT feature 
FROM table1 t1 
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid 
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>

Ancak, dizeleri listesini dinamik ve birkaç yüz uzun.

Orada saklı proc List<string> dizeleri listesini geçirmek için bir yol var mı???Yoksa daha iyi bir yolu bunu yapmak için?

Çok teşekkürler, Brett

CEVAP
17 AĞUSTOS 2011, ÇARŞAMBA


Eğer SQL Server kullanıyorsanız yeni bir özellikli var 2008, bir Kullanıcı Tanımlı Tablo Türü denir. Burada kullanmak için nasıl bir örnek:

Masa Türü Tanımlı: Kullanıcı oluşturun

CREATE TYPE [dbo].[StringList] AS TABLE(
    [Item] [NVARCHAR](MAX) NULL
);

Sonraki düzgün saklı yordamı kullanmanız gerekir:

CREATE PROCEDURE [dbo].[sp_UseStringList]
    @list StringList READONLY
AS
BEGIN
    -- Just return the items we passed in
    SELECT l.Item FROM @list l;
END

Sonunda burada c kullanmak için bazı sql#:

using (var con = new SqlConnection(connstring))
{
    con.Open();

    using (SqlCommand cmd = new SqlCommand("exec sp_UseStringList @list", con))
    {
        var table = new DataTable();
        table.Columns.Add("Item", typeof(string));

        for (int i = 0; i < 10; i  )
            table.Rows.Add("Item "   i.ToString());

        var pList = new SqlParameter("@list", SqlDbType.Structured);
        pList.TypeName = "dbo.StringList";
        pList.Value = table;

        cmd.Parameters.Add(pList);

        using (var dr = cmd.ExecuteReader())
        {
            while (dr.Read())
                Console.WriteLine(dr["Item"].ToString());
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fuse

    Fuse

    21 Kasım 2005
  • KittiesMama

    KittiesMama

    10 AĞUSTOS 2008
  • sknbp

    sknbp

    16 Kasım 2006