2012-02-04 25 views
7

Tôi đang chuyển đổi từ ASP cổ điển sang ASP.NET. Và tôi đang gặp một số rắc rối khi thực hiện một số công cụ cơ bản mà tôi đã từng làm một cách dễ dàng với phương pháp cũ. Dưới đây là một hàm ASP tiện dụng mà tôi đã sử dụng để thực hiện các truy vấn vô hướng với một vài dòng.Tham số SQL và Dấu hỏi

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 

tôi sử dụng để vượt qua một truy vấn SQL với dấu hỏi như giữ chỗ cho các thông số như thế này:

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

Sau đó tôi sẽ thiết lập một mảng các tham số và vượt qua nó vào chức năng:

MyArray = ARRAY("1-JAN-2012",1) 

Các tham số trong mảng sẽ thay thế dấu chấm hỏi trong chuỗi truy vấn theo thứ tự chúng xuất hiện.

Tôi đang cố gắng bắt chước chức năng này trong C# nhưng tôi bị kẹt trong phần mà tôi phải chuyển các tham số. Cho đến nay tôi đã đến điểm mà tôi phải sử dụng giữ chỗ tên như @Created và @AdminLevel thay cho dấu hỏi và sau đó tôi phải thiết lập đối tượng tham số như thế này:

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

Có cách nào để chuyển các tham số mà không cần phải đặt tên tham số và chỉ cần sử dụng dấu hỏi và thứ tự mà chúng xuất hiện để chỉ định tham số đi đâu?

+2

Tôi tin rằng ADO.Net chỉ hỗ trợ các tham số có tên. Xin lỗi :) – dana

+0

+1 cho 'Tiếp theo' ParamCount' - Tôi nghĩ tôi là người điên duy nhất đã làm điều đó! ; o) – Paul

Trả lời

3

chỉnh sửa: như được chỉ ra bởi Dana MSDN Docs for Parameters cho thấy bạn cần sử dụng các tham số có tên cho SqlClient nhưng có thể sử dụng thông số vị trí cho OleDb/ODBC.

Bạn có thể thêm thông số dễ dàng hơn bằng cách sử dụng mã bên dưới; đó là bộ xương tôi sử dụng nhưng tôi chắc chắn có một cách tốt hơn để làm điều đó.

Bạn vẫn cần phải sử dụng các tham số có tên, nhưng bạn có thể mô phỏng các dấu hỏi của bạn ở mức độ bằng cách đặt tên chúng là @a, @b, @c .. - thông số vị trí là tốt cho đến khi bạn nhận được nhiều thông số và bạn phải liên tục đếm số lượng dấu hỏi để tìm ra giá trị tham số nào đang được áp dụng ở đâu, thường dẫn đến lỗi.

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

OK, Cảm ơn! Điều tôi đã làm là thêm tên tham số ngẫu nhiên (nhưng duy nhất) thay vì dấu hỏi và sau đó thực hiện một hàm để phân tích cú pháp truy vấn SQL cho tên tham số (bắt đầu bằng '@') và lưu chúng trong một mảng sau đó được sử dụng trong kết hợp với các giá trị trong mảng khác (Parameter_Array) cho lệnh AddWithValue. Tôi sẽ chia sẻ mã cho hàm phân tích cú pháp, nhưng nó sẽ không phù hợp với nhận xét này. – Osprey

+0

Bạn có thể chỉnh sửa câu hỏi gốc của mình và thêm mã vào đó nếu bạn muốn. Cá nhân tôi sẽ xem xét điều chỉnh mã của bạn để bạn vẫn có thể sử dụng các thông số được đặt tên đúng; có chức năng của bạn chấp nhận các tham số SQL như một KeyValuePair chẳng hạn và sau đó lặp lại chúng, ánh xạ nó vào bộ sưu tập command.Parameters của bạn. – akiller

Các vấn đề liên quan