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

  • Ammine Getahun

    Ammine Getah

    21 HAZİRAN 2011
  • Google Россия

    Google Ро

    9 Temmuz 2007
  • UCBerkeley

    UCBerkeley

    3 Mayıs 2006