Raw*_*hi 31 c# json sqldatareader
public string toJSON(SqlDataReader o)
{
StringBuilder s = new StringBuilder();
s.Append("[");
if (o.HasRows)
while (o.Read())
s.Append("{" + '"' + "Id" + '"' + ":" + o["Id"] + ", "
+ '"' + "CN" + '"' + ":" + o["CatName"] + ", "
+ '"' + "Ord" + '"' + ":" + o["Ord"] + ","
+ '"' + "Icon" + '"' + ":" + o["Icon"] + "}, ");
s.Remove(s.Length - 2, 2);
s.Append("]");
o.Close();
return s.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我在这里使用我自己的函数进行序列化.我需要知道这是一个好方法还是我应该使用另一个.顺便说一下,我试过使用JavaScriptSerializer但是这不适用于SqlDataReader.感谢名单
Jon*_*han 54
如果你想要转换为任意JSON的东西,你可以通过将它序列化为Dictionary(Of string,object)进行转换:
public IEnumerable<Dictionary<string, object>> Serialize(SqlDataReader reader)
{
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));
return results;
}
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]);
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后使用NewtonSoft.Json JsonConvert对象获取您的JSON:
var r = Serialize(reader);
string json = JsonConvert.SerializeObject(r, Formatting.Indented);
Run Code Online (Sandbox Code Playgroud)
更新: 如果您只是想使用内置方法,而您恰好使用MVC,则可以在新序列化中使用内置的Json辅助方法:
JsonResult Index(int id) {
var r = Serialize(reader);
return Json(r, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ick 19
我遇到了数据读取器返回的行数在内存消耗方面可能会出现问题的用例.以下代码在流上使用JsonWriter(来自JSON.NET).人们当然可以辩论巨大的JSON文档的效用,但有时我们的用例由其他人决定:-)
几点说明:
代码:
var stream = ... // In my case, a FileStream or HttpResponse stream
using (var writer = new JsonTextWriter(new StreamWriter(stream)))
{
writer.WriteStartObject();
do
{
int row = 0;
string firstColumn = null;
while (await reader.ReadAsync())
{
if (row++ == 0)
{
firstColumn = reader.GetName(0);
writer.WritePropertyName(string.Format("{0}Collection", firstColumn));
writer.WriteStartArray();
}
writer.WriteStartObject();
for (int i = 0; i < reader.FieldCount; i++)
{
if (!reader.IsDBNull(i)) {
writer.WritePropertyName(reader.GetName(i));
writer.WriteValue(reader.GetValue(i));
}
}
writer.WriteEndObject();
}
writer.WriteEndArray();
} while (await reader.NextResultAsync());
writer.WriteEndObject();
}
Run Code Online (Sandbox Code Playgroud)
异构输出的一个例子是:
{
"ContactCollection": {
"ContactItem": [{
"ContactID": "1",
"Contact": "Testing",
},
{
"ContactID": "2",
"Contact": "Smith, John",
},
{
"ContactID": "4",
"Contact": "Smith, Jane",
}
],
"MessageItem": [{
"MessageID": "56563",
"Message": "Contract Review Changed",
},
{
"MessageID": "56564",
"Message": " Changed",
},
{
"MessageID": "56565",
"Message": "Contract Review - Estimated Completion Added.",
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
参考:
Dav*_*ter 15
另一个选择是使用James Newton-King优秀的JSON.NET库 - http://www.newtonsoft.com/json
这是一个快速示例,介绍如何使用它来构建集合,然后将其作为JSON序列化字符串输出:
using Newtonsoft.Json;
class Program
{
static void Main(string[] args)
{
ArrayList objs = new ArrayList();
//get the data reader, etc.
while(o.Read())
{
objs.Add(new
{
Id = o["Id"],
CN = o["CatName"],
Ord = o["Ord"],
Icon = o["Icon"]
});
}
//clean up datareader
Console.WriteLine(JsonConvert.SerializeObject(objs));
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
通过将SqlDataReader的每一行读入一个匿名对象,然后使用JSON.NET将其序列化为字符串,您可以对循环执行相同的操作.
希望这可以帮助!
小智 8
这应该做的工作
private String sqlDatoToJson(SqlDataReader dataReader)
{
var dataTable = new DataTable();
dataTable.Load(dataReader);
string JSONString = string.Empty;
JSONString = JsonConvert.SerializeObject(dataTable);
return JSONString;
}
Run Code Online (Sandbox Code Playgroud)
试试这个:
o = cmd.ExecuteReader();
var dataQuery = from d in o.Cast<DbDataRecord>()
select new
{
Id = (String)d["Id"],
CN = (String)d["CatName"],
Ord = (String)d["Ord"],
Icon = (String)d["Icon"]
};
var data = dataQuery.ToArray();
JavaScriptSerializer serializer = new JavaScriptSerializer();
String jsonData = serializer.Serialize(data);
Run Code Online (Sandbox Code Playgroud)
自 SQL Server 2016 起,Microsoft 将此功能嵌入到 sql 查询中。您可以通过FOR JSON在查询结束时使用关键字来实现它。
select * from table_example where somecolumn = somecondition FOR JSON AUTO
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息和示例,您可以通过此官方文档使用 AUTO 模式自动格式化 JSON 输出(SQL Server)
这是来自 Microsoft 的 C# 代码示例,用于从 SQL 查询中获取 JSON 字符串。
var queryWithForJson = "SELECT ... FOR JSON";
var conn = new SqlConnection("<connection string>");
var cmd = new SqlCommand(queryWithForJson, conn);
conn.Open();
var jsonResult = new StringBuilder();
var reader = cmd.ExecuteReader();
if (!reader.HasRows)
{
jsonResult.Append("[]");
}
else
{
while (reader.Read())
{
jsonResult.Append(reader.GetValue(0).ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
警告:此解决方案仅对SQL SERVER 2016及更高版本有效。
我使用此代码,基于乔纳森的回答:
private IEnumerable<Dictionary<string, object>> ConvertToDictionary(IDataReader reader)
{
var columns = new List<string>();
var rows = new List<Dictionary<string, object>>();
for (var i = 0; i < reader.FieldCount; i++)
{
columns.Add(reader.GetName(i));
}
while (reader.Read())
{
rows.Add(columns.ToDictionary(column => column, column => reader[column]));
}
return rows;
}
Run Code Online (Sandbox Code Playgroud)
进而:
var rows = this.ConvertToDictionary(reader);
return JsonConvert.SerializeObject(rows, Formatting.Indented);
Run Code Online (Sandbox Code Playgroud)
使用Cinchoo ETL - 一个开源库,您可以通过几行代码轻松将 SqlDataReader 导出为 JSON
\n\nstring connectionstring = @"Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Northwind;Integrated Security=True";\nStringBuilder sb = new StringBuilder();\n\nusing (var conn = new SqlConnection(connectionstring))\n{\n conn.Open();\n var comm = new SqlCommand("SELECT top 2 * FROM Customers", conn);\n\n using (var parser = new ChoJSONWriter(sb))\n parser.Write(comm.ExecuteReader());\n}\n\nConsole.WriteLine(sb.ToString());\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\n[\n {\n "CustomerID": "ALFKI",\n "CompanyName": "Alfreds Futterkiste",\n "ContactName": "Maria Anders",\n "ContactTitle": "Sales Representative",\n "Address": "Obere Str. 57",\n "City": "Berlin",\n "Region": {},\n "PostalCode": "12209",\n "Country": "Germany",\n "Phone": "030-0074321",\n "Fax": "030-0076545"\n },\n {\n "CustomerID": "ANATR",\n "CompanyName": "Ana Trujillo Emparedados y helados",\n "ContactName": "Ana Trujillo",\n "ContactTitle": "Owner",\n "Address": "Avda. de la Constituci\xc3\xb3n 2222",\n "City": "M\xc3\xa9xico D.F.",\n "Region": {},\n "PostalCode": "05021",\n "Country": "Mexico",\n "Phone": "(5) 555-4729",\n "Fax": "(5) 555-3745"\n }\n]\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
55655 次 |
| 最近记录: |