2014-11-08 67 views
0

我將數據讀取器的結果序列化到WEB API應用程序內部的JSON中。 我沒有使用預定義的類來保存來自閱讀器的數據。 由此產生的JSON正在與來自sql server management studio的結果進行比較。 在這兩種情況下,正在執行具有相同參數的相同存儲過程。 共有8個結果集。 第5個結果集應該有20行,返回0個結果。 7結果集包含兩行,而不是8SqlDataReader在某些結果集中跳過結果

在這兩種情況下,我使用的是在這裏發現了SO代碼,我改變了一點點: 第一種情況 - 系列化手動創建對象:

public JsonResult<Dictionary<string, List<Dictionary<string, object>>>> Get() 
    { 
     Dictionary<string, List<Dictionary<string, object>>> r = null; 
     using (var conn = new SqlConnection(_connString)) 
     { 
      using (var command = new SqlCommand("getReportData", conn) { CommandType = CommandType.StoredProcedure }) 
      { 
       command.Parameters.AddWithValue("@DateFrom", new DateTime(2014, 6, 1, 0, 0, 0)); 
       command.Parameters.AddWithValue("@DateTo", new DateTime(2014, 6, 1, 0, 0, 0)); 
       command.Parameters.AddWithValue("@UserIDList", "1,2,3,4,5,6,7"); 
       conn.Open(); 
       command.ExecuteNonQuery(); 
       reader = command.ExecuteReader(); 
       r = Serialize(reader); 
      } 
     } 

     return Json(r, new JsonSerializerSettings {Formatting = Formatting.Indented}); 
    } 

public Dictionary<string, List<Dictionary<string, object>>> Serialize(SqlDataReader reader) 
    { 
     string resultSetName = "resultSet_"; 
     int resultSetCount = 1; 

     var sets = new Dictionary<string, List<Dictionary<string, object>>>(); 
     var results = new List<Dictionary<string, object>>(); 

     var cols = new List<string>(); 
     for (var i = 0; i < reader.FieldCount; i++) 
      cols.Add(reader.GetName(i)); 

     while (reader.Read()) 
      results.Add(SerializeRow(cols, reader)); 

     sets.Add(resultSetName + resultSetCount, results); 

     while (reader.NextResult()) 
     { 

      resultSetCount++; 
      var resultsTmp = new List<Dictionary<string, object>>(); 
      var colsTmp = new List<string>(); 

      for (var i = 0; i < reader.FieldCount; i++) 
      { 
       colsTmp.Add(reader.GetName(i)); 
      } 

      while (reader.Read()) 
      { 
       resultsTmp.Add(SerializeRow(colsTmp, reader)); 
      } 

      var setTmp = new Dictionary<string, List<Dictionary<string, object>>>(); 

      sets.Add(resultSetName + resultSetCount, resultsTmp); 
     } 

     return sets; 
    } 
    private Dictionary<string, object> SerializeRow(IEnumerable<string> cols, 
                SqlDataReader reader) 
    { 
     var result = new Dictionary<string, object>(); 
     foreach (var col in cols) 
      result.Add(col, reader[col]); 

     _loopRowCount++; 
     return result; 
    } 

第二病例 - 使用數據適配器,構成詞典和序列化結果JSON:

public JsonResult<Dictionary<string, DataTable>> Get() 
    { 
     string setName = "resultSet_"; 
     int setCount = 1; 
     var dataTables = new Dictionary<string, DataTable>(); 
     using (var connection = new SqlConnection(_connString)) 
     { 
      using (var command = new SqlCommand("getReportData", connection) { CommandType = CommandType.StoredProcedure }) 
      { 
       command.Parameters.AddWithValue("@DateFrom", new DateTime(2014, 6, 1, 0, 0, 0)); 
       command.Parameters.AddWithValue("@DateTo", new DateTime(2014, 6, 1, 0, 0, 0)); 
       command.Parameters.AddWithValue("@UserIDList", "1,2,3,4,5,6,7"); 
       connection.Open(); 

       var adapter = new SqlDataAdapter(command); 
       var set = new DataSet(); 
       adapter.SelectCommand = command; 

       adapter.Fill(set); 

       foreach (DataTable t in set.Tables) 
       { 
        dataTables.Add(setName + setCount, t); 
        setCount++; 
       } 
      } 
     } 

     return Json(dataTables, new JsonSerializerSettings { Formatting = Formatting.Indented }); 
    } 

下面是執行存儲在SSMS

過程的代碼
USE [DB] 
GO 

DECLARE @return_value int 

EXEC @return_value = [dbo].[getReportData] 
     @DateFrom = '2013-06-01 00:00:00', 
     @DateTo = '2013-06-30 00:00:00', 
     @UserIDList = '1,2,3,4,5,6,7' 

SELECT 'Return Value' = @return_value 
GO 

這兩種方法在執行存儲過程時都會丟失完全相同的數據,並且顯然會返回更多數據。 我重複,相同的存儲過程,在所有三種情況下相同的參數。

奇怪的是生產代碼使用此存儲過程,但將數據從讀取器映射到預定義的類並且沒有數據丟失。

爲什麼讀者會忽略程序明顯返回的數據以及如何防止這種情況?

+0

你能展示如何在SSMS中調用存儲過程嗎? – 2014-11-08 20:55:36

+0

問題用執行存儲過程的代碼示例更新。 – 2014-11-08 21:04:37

+0

是否正確? '@ DateFrom'和'@ DateTo'值是不同的(在SSMS和C#中執行)。 – 2014-11-08 21:06:00

回答

1

從您發佈的代碼中,在SSMS與C#中執行時,@DateFrom@DateTo的值不同。