SORU
19 Kasım 2008, ÇARŞAMBA


Ve benzeri koşulları ile parametre tabanlı Sorgular

Parametre tabanlı Sorgular .Net her zaman örneklerde şöyle:

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID = @categoryid
", 
   conn);
comm.Parameters.Add("@categoryid", SqlDbType.Int);
comm.Parameters["@categoryid"].Value = CategoryID;

Ama bir tuğla duvar aşağıdakileri yapmaya çalışan biriyim:

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID IN (@categoryids) 
      OR  name LIKE '%@name%'
", 
   conn);
comm.Parameters.Add("@categoryids", SqlDbType.Int);
comm.Parameters["@categoryids"].Value = CategoryIDs;
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = Name;

Nerede

  • CategoryİDs numaraları virgülle ayrılmış bir listesidir "123,456,789" (tırnak işaretleri olmadan)
  • Adı bir dize, belki de tek tırnaklı ve diğer kötü karakterler ile

Doğru bu için sözdizimi nedir?

CEVAP
19 Kasım 2008, ÇARŞAMBA


Tamsayı dizisi ve bir Adı kimliklerinizi kategori var diyelim bir dize. Hile sizin kategorisindeki tüm kimlikleri tek tek parametre olarak girin ve Adı bulanık maç oluşturmak için izin vermek için komut metin oluşturmaktır. Eski yapmak için, parametre adları bir dizi oluşturmak için bir döngü kullanırız @p0 @pN-1 N kategori sayısıdır dizideki kimlikleri aracılığıyla. O zaman biz bir parametre oluşturmak ve her adlandırılmış parametre için değer olarak ilişkili kategori kimliği ile komut ekleyin. Sonra sorguda adını kendisi adı üzerinde bulanık arama izin vermek için birleştirme kullanıyoruz.

string Name = "someone";
int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617,
                                1618, 1619, 1620, 1951, 1952,
                                1953, 1954, 1955, 1972, 2022 };

SqlCommand comm = conn.CreateCommand();

string[] parameters = new string[categoryIDs.Length];
for(int i=0;i<categoryIDs.Length;i  )
{
   parameters[i] = "@p" i;
   comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]);
}
comm.Parameters.AddWithValue("@name",Name);
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText  = string.Join(",", parameters)   ")";
comm.CommandText  = " OR name LIKE '%'   @name   '%'";

Bu DBA mutlu etmeli bu tamamen parametrik sorgu. Bu tamsayılar olduğundan, ama hala adını parameterizing iken komut metin doğrudan değerlerle inşa etmek, güvenlik riski çok fazla olmayacağını sanıyorum. Kategoriniz varsa kimlikleri dize bir dizi vardır, sadece virgül üzerinde bir dizi bölme, bir tamsayı için her dönüştürmek, ve bir tamsayı dizisi içinde saklayın.

Not:Dizi diyorum ve örnek olarak kullanabilirsiniz, ama yineleme muhtemelen farklılık gösterse de, herhangi bir koleksiyon için çalışması gerektiğini.

http://www.tek-tips.com/viewthread.cfm?qid=1502614&page=9 orijinal fikir

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dopelives

    Dopelives

    30 Temmuz 2009
  • Manuel Vizcaino

    Manuel Vizca

    27 Mayıs 2008
  • TROPFEST

    TROPFEST

    27 Mart 2007