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
這兩種方法在執行存儲過程時都會丟失完全相同的數據,並且顯然會返回更多數據。 我重複,相同的存儲過程,在所有三種情況下相同的參數。
奇怪的是生產代碼使用此存儲過程,但將數據從讀取器映射到預定義的類並且沒有數據丟失。
爲什麼讀者會忽略程序明顯返回的數據以及如何防止這種情況?
你能展示如何在SSMS中調用存儲過程嗎? – 2014-11-08 20:55:36
問題用執行存儲過程的代碼示例更新。 – 2014-11-08 21:04:37
是否正確? '@ DateFrom'和'@ DateTo'值是不同的(在SSMS和C#中執行)。 – 2014-11-08 21:06:00