2014-04-27 14 views
11

Tôi đang cố gắng tạo một SqlParameterCollection, nhưng cung cấp lỗi trong khi thêm một số SqlParameter trong phương thức sp.Add().Làm thế nào để tạo SqlParameterCollection với nhiều tham số?

Vui lòng giúp tôi cách thêm thông số và cách chuyển thông số cho hàm khác của tôi nơi tôi khai báo SqlConnectionSqlCommand.

SqlParameterCollection sp = null;      
sp.Add(new SqlParameter("@CmpyCode", SqlDbType.NVarChar)).Value = CV.Global.CMPYCODE; 
sp.Add(new SqlParameter("@Code", SqlDbType.NVarChar)).Value = codeName; 
sp.Add(new SqlParameter("@DisplayCode", SqlDbType.NVarChar)).Value = codeName + "-"; 
sp.Add(new SqlParameter("@TotalDigit", SqlDbType.Int)).Value = CV.Global.PARAMTOTALDIGIT; 
insertData("<Sp Name>", sp); 

chức năng My khác là insertData (...)

internal static int insertData(string spName, SqlParameterCollection sp) 
{ 
     int retObj = 0; 

     using (SqlConnection con = new SqlConnection(CV.Global.CONSTRING)) 
     { 
      try 
      { 
       con.Open(); 
       SqlCommand cmd = new SqlCommand(spName, con); 
       cmd.CommandType = CommandType.StoredProcedure; 

       if (sp.Count > 0) 
       { 
        foreach (SqlParameter param in sp) 
         cmd.Parameters.Add(param); 
       } 

       retObj = cmd.ExecuteNonQuery(); 
      } 
      catch (Exception ev) 
      { 
       Util.Log(ev); 
       throw; 
      } 
      finally 
      { 
       try 
       { 
        con.Close(); 
       } 
       catch (Exception ev) { Util.Log(ev); throw; } 
      } 
     } 
     return retObj; 
    } 

tôi đang cố gắng để tạo ra một SqlParameterCollection và thông qua nó vào insertData chức năng. Nhưng nó ném một lỗi trong khi tôi đang gọi phương thức sp.Add() trong hàm đầu tiên của tôi.

Lỗi này là

Object tài liệu tham khảo không được đặt để một thể hiện của một đối tượng

+0

cố gắng sử dụng sqlcommand và Parameters.AddWithValue –

+0

Bạn không bao giờ cho chúng tôi biết bạn mắc lỗi gì, bạn mong đợi chúng tôi giúp đỡ như thế nào nếu bạn không nói chính xác điều gì đã xảy ra. –

+0

nó cho lỗi "Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng" – prog1011

Trả lời

31

Bạn không thể sử dụng bất kỳ biến như SqlParameterCollection (một đối tượng tài liệu tham khảo) mà không có một cuộc gọi đến constructor của nó (mới) , nhưng SqlParameterCollection là một đối tượng không thể được khởi tạo trực tiếp bằng một đối tượng mới. Nó không có hàm tạo mặc định và chỉ có thể được truy xuất từ ​​một số tồn tại SqlCommand.

SqlCommand cmd = new SqlCommand(commandText, connection); 
SqlParameterCollection sp = cmd.Parameters; 

Tôi đề nghị để thay đổi phương thức InsertData bạn để chấp nhận một List<SqlParameter> và để cho nó xử lý thêm các thông số cho SqlCommand thực thi các văn bản lệnh

List<SqlParameter> sp = new List<SqlParameter>() 
{ 
    new SqlParameter() {ParameterName = "@CmpyCode", SqlDbType = SqlDbType.NVarChar, Value= CV.Global.CMPYCODE}, 
    new SqlParameter() {ParameterName = "@Code", SqlDbType = SqlDbType.NVarChar, Value = codeName}, 
    new SqlParameter() {ParameterName = "@DisplayCode", SqlDbType = SqlDbType.NVarChar, Value = codeName + "-"}, 
    new SqlParameter() {ParameterName = "@TotalDigit", SqlDbType = SqlDbType.Int, Value = CV.Global.PARAMTOTALDIGIT} 
}; 
insertData(CV.Sps.SP_INSERT_PARAM_TABLE, sp); 

insertData chỉ đơn giản là nhận được một danh sách tùy chọn của SqlParameter và thêm chúng vào bộ sưu tập thông số SqlCommand nội bộ nếu cần

internal static int insertData(string spName, List<SqlParameter> sp = null) 
{ 
    .... 
    if(sp != null) 
     cmd.Parameters.AddRange(sp.ToArray()); 
    .... 
} 
+2

Thay vì 'foreach', bạn cũng có thể chỉ cần' cmp.Parameters.AddRange (parameterPassed.ToArray()) 'hoạt động này rất tốt với' params Tham số SqlParameter [] parametersPassed' trong hàm của bạn. –

+0

Ồ vâng bạn đúng, chỉ bận rộn sửa chữa một cái gì đó trên danh sách tham số khởi tạo – Steve

+1

@Steve Nó cho lỗi vì tôi muốn thêm SqlParameter với 'SqlDbType' và' Value' cả, mã của bạn chỉ cho phép '(" @ParameterName ") và (giá trị đối tượng) 'nhưng tôi muốn đề cập đến một' SqlDbType' cũng – prog1011

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