2009-07-30 49 views
45

Im gọi một thủ tục lưu trữ SQL từ một mảnh mã C# .net:Làm thế nào để vượt qua một biến null tới một SQL Stored Procedure từ C# .net đang

SqlHelper.ExecuteDataset(sqlConnection, CommandType.StoredProcedure, STORED_PROC_NAME, sqlParameters); 

nơi biến sqlParameters được định nghĩa là:

 SqlParameter[] sqlParameters = new SqlParameter[SQL_NUMBER_PARAMETERS]; 

     Log.Logger.Debug(string.Format("Running proc: {0} ", STORED_PROC_NAME)); 

     SqlParameters[0] = new SqlParameter("fieldID", SqlDbType.BigInt); 
     SqlParameters[0].Value = fieldID; 
     SqlParameters[0].Direction = ParameterDirection.Input; 

tôi cần đến nay vượt qua trong hai tham số khác để Proc lưu trữ này, (cả hai đều là loại SqlDateTime), mà sẽ NULL trong trường hợp này.

Cảm ơn,

TRÊN

Trả lời

63
SqlParameters[1] = new SqlParameter("Date1", SqlDbType.SqlDateTime); 
SqlParameters[1].Value = DBNull.Value; 
SqlParameters[1].Direction = ParameterDirection.Input; 

... sau đó sao chép cho phần thứ hai.

9

Bạn có thể vượt qua DBNull.Value vào bất động sản .Value của tham số:

SqlParameters[0] = new SqlParameter("LedgerID", SqlDbType.BigInt); 
    SqlParameters[0].Value = DBNull.Value; 

Chỉ cần điều chỉnh cho hai tham số DateTime của bạn, rõ ràng - chỉ hiển thị cách sử dụng DBNull.Value giá trị tài sản tại đây.

Marc

23

Sử dụng DBNull.Value Vẫn còn tốt hơn, làm cho các tham số thủ tục lưu trữ của bạn có mặc định là NULL. Hoặc sử dụng một tham số Nullable<DateTime> nếu tham số đôi khi sẽ là một đối tượng DateTime hợp lệ

+2

Bạn nhận được +1 cho là người đầu tiên đề cập đến thông số mặc định cho khả năng proc được lưu trữ. – Beska

0
SQLParam = cmd.Parameters.Add("@RetailerID", SqlDbType.Int, 4) 
    If p_RetailerID.Length = 0 Or p_RetailerID = "0" Then 
     SQLParam.Value = DBNull.Value 
    Else 
     SQLParam.Value = p_RetailerID 
    End If 
7

tôi sử dụng một phương pháp để chuyển đổi sang DBNull nếu nó là null

// Converts to DBNull, if Null 
    public static object ToDBNull(object value) 
    { 
     if (null != value) 
      return value; 
     return DBNull.Value; 
    } 

Vì vậy, khi thiết lập các thông số, chỉ cần gọi chức năng

sqlComm.Parameters.Add(new SqlParameter("@NoteNo", LibraryHelper.ToDBNull(NoteNo))); 

Điều này sẽ đảm bảo bất kỳ giá trị rỗng nào, được đổi thành DBNull.Value, nếu không sẽ được giữ nguyên.

+1

đó là giải pháp tốt tôi đã thay đổi phương thức tĩnh thành phương thức mở rộng cho đối tượng 'đối tượng tĩnh công khai ToDbNull (giá trị đối tượng này) { if (null!= giá trị) giá trị trả về; trả lại DBNull.Value; } ' – Gayan

+0

Ngoại trừ một DateTime không phải là một loại nullable, do đó, điều này sẽ không hoạt động cho DateTime (như được chỉ định trong câu hỏi), hoặc cho bất kỳ loại giá trị không nullable nào khác, trừ khi bạn khai báo tất cả các vars là Nullable mà dường như không phải là cách tiếp cận đặc biệt tốt. –

+0

@MayorBoris Sử dụng khung thực thể. Tốt hơn rất nhiều. – Doomsknight

0

dùng thử! cú pháp ít dòng hơn và gọn hơn nữa! đừng quên thêm các thuộc tính bạn muốn thêm với phương pháp này!

cmd.Parameters.Add(new SqlParameter{SqlValue=(object)username??DBNull.Value,ParameterName="user" } ); 
0

Hãy nói tên của tham số là "Id" trong thủ tục lưu trữ SQL của bạn, và C# chức năng bạn đang sử dụng để gọi thủ tục lưu trữ cơ sở dữ liệu là tên của loại int?. Cho rằng, sau đây có thể giải quyết vấn đề của bạn:

public void storedProcedureName(Nullable<int> id, string name) 
{ 
    var idParameter = id.HasValue ? 
       new SqlParameter("Id", id) : 
       new SqlParameter { ParameterName = "Id", SqlDbType = SqlDbType.Int, Value = DBNull.Value }; 

    // to be continued... 
1

Cũ câu hỏi, nhưng đây là một cách khá sạch sẽ để tạo ra một tham số nullable:

new SqlParameter("@note", (object) request.Body ?? DBNull.Value); 

Nếu request.Body có giá trị, thì đó là giá trị đã sử dụng. Nếu nó là null, thì DbNull.Value được sử dụng.

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