2012-02-04 22 views
7

Klasik ASP'den ASP.NET'e geçiş yapıyorum. Ve eski yöntemle kolayca yaptığım bazı temel şeyleri yapmakta sorun yaşıyorum. Aşağıda birkaç satır ile skaler sorguları yürütmek için kullanılan kullanışlı bir ASP işlevi. Sonra bir parametre dizisi kurmak ve işlevine geçerdiSQL Parametreleri ve Soru İşaretleri

SELECT TOP 1 UserName FROM Members WHERE (Created>?) AND (AdminLevel=?); 

:

FUNCTION ExecuteScalarParams(SQLQuery, Parameter_Array) 
Set cmd1 = Server.CreateObject("ADODB.Command") 
cmd1.ActiveConnection = con 
cmd1.CommandText = SQLQuery 
cmd1.CommandType = 1 

FOR ParamCount = 0 TO UBOUND(Parameter_Array) 
    cmd1.Parameters(ParamCount) = Parameter_Array(ParamCount) 
NEXT 'ParamCount 

Set rstScalar = cmd1.Execute() 

IF NOT rstScalar.EOF THEN 
    arrScalar = rstScalar.GetRows() 
    IF UBOUND(arrScalar,2) = 0 THEN 
     ExecuteScalarParams = arrScalar(0,0) 
    ELSE 
     ExecuteScalarParams = NULL 
    END IF 
ELSE 
    ExecuteScalarParams = NULL 
END IF 

rstScalar.Close 
Set rstScalar = Nothing 
Set cmd1 = Nothing 
END FUNCTION 

böyle parametreler için yer tutucular olarak soru işaretleri ile bir SQL sorgusu geçirmek için kullanılan

Dizideki parametreler, sorgu dizesindeki soru işaretlerinin göründükleri sıraya göre yerine konacaktır.

Bu işlevi C# ile taklit etmeye çalışıyorum ama parametreleri geçmem gereken kısımda takılıyorum. Şimdiye kadar böyle yerine soru işaretleri @Created ve @AdminLevel olarak adlandırılan yer tutucuları kullanılan ve daha sonra böyle parametre nesneleri kurmak zorunda noktaya var:

SqlParameter param = new SqlParameter(); 
param.ParameterName = "@AdminLevel"; 
param.Value = 1; 

bir yolu var mı Parametre isimlerini ayarlamak zorunda kalmadan parametreleri aktarmak ve sadece soru işaretlerini ve hangi parametrenin nereye gittiğini belirttikleri sıralamayı kullanmak yeterlidir?

+2

ADO.Net'in yalnızca adlandırılmış parametreleri desteklediğine inanıyorum. Üzgünüz :) – dana

+0

+1 'Sonraki' ParamCount' için - Ben bunu yapan tek deli olduğumu düşündüm! ; o) – Paul

cevap

3

düzenleme: Dana tarafından işaret edildiği gibi MSDN Docs for Parameters, SqlClient için adlandırılmış parametreleri kullanmanız gerektiğini gösterir, ancak OleDb/ODBC için konumsal parametreleri kullanabilir.

Aşağıdaki kodu kullanarak çok daha kolay parametre ekleyerek yapabilirsiniz; Kullandığım iskelet ama eminim bunu yapmanın daha iyi bir yolu var.

Adlandırılmış parametreler kullanmaya devam etmelisiniz, ancak soru işaretlerinizi @a, @b, @c .. adlarına göre bir dereceye kadar simüle edebilirsiniz - konumsal parametreler, bir avuç parametreden daha fazlasını elde edene kadar iyidir. Hangi parametre değerinin uygulandığını bulmak için soru işaretlerinin sayısını sürekli olarak saymanız gerekir, bu da genellikle hatalarla sonuçlanır.

using (var con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
{ 
    con.Open(); 
    { 
     using (var command = con.CreateCommand()) 
     { 
      command.Connection = conn; 
      command.CommandText = "SELECT * FROM [dbo].[Table] WHERE [c1] = @a AND [c2] = @b"; 
      command.Parameters.AddWithValue("@a", aVal); 
      command.Parameters.AddWithValue("@b", bVal); 
      command.CommandType = CommandType.Text; 

      using (var reader = command.ExecuteReader()) 
      { 
       if (reader.HasRows) 
       { 
        while (reader.Read()) 
        { 
         /// 
        } 
       } 
       else 
       { 
        /// 
       } 
      } 
     } 
    } 
} 
+0

Tamam, teşekkürler! Ne yaptım soru işaretleri yerine rastgele (ama benzersiz) parametre isimleri eklemek ve daha sonra parametre isimleri için SQL sorgusu ('@' ile başlayan) ayrıştırmak ve daha sonra kullanılan bir dizide kaydetmek için bir işlev yaptı. AddWithValue komutu için diğer dizideki (Parameter_Array) değerlerle birlikte. Ayrıştırma işlevi için kodu paylaşırdım, ancak bu yoruma uymaz. – Osprey

+0

Özgün sorularınızı düzenleyebilir ve isterseniz kodu buraya ekleyebilirsiniz. Şahsen ben kodunuzu ayarlamaya bakacağım, böylece adlandırılmış parametreleri yine de kullanabilirsiniz; fonksiyonunuzun SQL parametrelerini bir KeyValuePair olarak kabul etmesini sağlayın ve daha sonra bunların üzerine gelip komutunuzla eşleştirin.Parametreler koleksiyonu. – akiller

İlgili konular