2012-05-08 29 views
8

Tôi cần tạo một trình ghi nhật ký chung để ghi lại các câu lệnh chèn/cập nhật nhất định để người thử nghiệm của tôi có thể xác minh dữ liệu được chèn là chính xác. Ý tưởng đầu tiên của tôi là tôi sẽ chỉ sử dụng một hàm được chấp nhận DynamicParameters và tôi sẽ thông qua DynamicParameters để tạo chuỗi để liệt kê tên và giá trị của tham số và làm cho chúng dễ đọc hơn cho người thử nghiệm.Có cách nào để lặp lại thông qua đối tượng Dapper DynamicParameters không?

Thật không may, Dapper.DynamicParameters không chứa một định nghĩa nào cho "GetEnumerator"

Dưới đây là ví dụ cơ bản về những gì tôi đã hy vọng để làm:

string myFormattedListofParameters = ""; 
foreach (var p in myDynamicParameters) 
{ 
myFormattedListofParameters += p.Name + "=" + p.Value.ToString(); 
} 

Trả lời

5

Hãy thử:

  var sb = new StringBuilder(); 
      foreach (var name in p.ParameterNames) 
      { 
       var pValue = p.Get<dynamic>(name); 
       sb.AppendFormat("{0}={1}\n", name, pValue.ToString()); 
      } 
+0

Cảm ơn sự giúp đỡ của Sam. BTW, yêu Dapper, nó đã giúp tôi tiết kiệm rất nhiều thời gian và đau đầu. Khi tôi thử đoạn mã trên, tôi nhận được ... 'Dapper.DynamicParameters' không chứa định nghĩa cho 'ParameterNames'. – SLoret

+7

@Sam Saffron Tôi nhận được ngoại lệ sau khi tôi làm theo mã của bạn: [NullReferenceException: Tham chiếu đối tượng không được đặt thành thể hiện của đối tượng.] Dapper.DynamicParameters.Get (Tên chuỗi) trong c: \ Dev \ Dapper \ Dapper \ SqlMapper.cs: 2574 –

+2

Tôi nhận được ngoại lệ này giống như Gary ở đây. Mọi cập nhật về điều này? –

-1

Chỉ trong trường hợp,

var pmaster = new Dapper.DynamicParameters();        
SortedList l = new SortedList(); 
l.Add("param1", object1); 
l.Add("param2", object2); 
l.Add("param3", object3); 
l.Add("param4", object4); 

foreach(var key in l.Keys) 
{ 
    var val = l[key]; 
    pmaster.Add(key.ToString(), val); 
} 

Làm việc cho tôi.

+0

Điều này sẽ không giúp đỡ trong các tình huống mà tôi muốn đóng gói sự trừu tượng ra xa. Nếu tôi đã đặt điều này trong một phương thức nói FormatDynamicParameters, bây giờ tôi sẽ yêu cầu tất cả người tiêu dùng của tôi vượt qua trong một thể hiện của DynamicParameters và một thực thi IList. –

5
string ParametersToString(DynamicParameters parameters) 
    { 
     var result = new StringBuilder(); 

     if (parameters != null) 
     { 
      var firstParam = true; 
      var parametersLookup = (SqlMapper.IParameterLookup)parameters; 
      foreach (var paramName in parameters.ParameterNames) 
      { 
       if (!firstParam) 
       { 
        result.Append(", "); 
       } 
       firstParam = false; 

       result.Append('@'); 
       result.Append(paramName); 
       result.Append(" = "); 
       try 
       { 
        var value = parametersLookup[paramName];// parameters.Get<dynamic>(paramName); 
        result.Append((value != null) ? value.ToString() : "{null}"); 
       } 
       catch 
       { 
        result.Append("unknown"); 
       } 
      } 

     } 
     return result.ToString(); 
    } 
+0

Việc truyền tới SqlMapper.IParameterLookup đã giúp tôi tránh được NullReferenceException mà tôi đã nhận được khi cố gắng lặp qua bộ sưu tập trước khi được sử dụng trên một cá thể IDbConnection. Cảm ơn! –

+0

Nhiều năm sau - điều này đã giải quyết được. –

+0

Cảm ơn vì điều này, đã giúp khi viết các bài kiểm tra đơn vị xác nhận các thông số chính xác khi được kết nối với các giá trị chính xác trong các cuộc gọi đến trình bao bọc Dapper của chúng tôi – nrjohnstone

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