从 SQL Server 数据库创建 JSON 结果
Posted
技术标签:
【中文标题】从 SQL Server 数据库创建 JSON 结果【英文标题】:Creating a JSON result from SQL server database 【发布时间】:2012-03-14 01:19:06 【问题描述】:我有一个具有以下布局的 SQL 服务器
Table ( id int
title varchar(40),
start Date(),
end Date(),
allDay bool,
username varchar(40)
);
我从this blog 获得了以下代码,用于从我希望使用的数据创建一个 JSON 对象,但是他的数据存储方式不同。如何创建从我的数据库中提取的相同对象?
我猜我需要将文件设为 .cshtml 文件而不是 .js 文件并使用它:
@
var db = Database.Open("events");
var selectQueryString = "SELECT * FROM events";
@foreach(var row in db.Query(selectQueryString))
但是我该如何调整这段代码来生成相同的 JSON 对象呢?
这是来自博客的相关代码,我的尝试如下:
public JsonResult GetEvents(double start, double end)
var userName = Session["UserName"] as string;
if(string.IsNullOrEmpty(userName))
return null;
var fromDate = ConvertFromUnixTimestamp(start);
var toDate = ConvertFromUnixTimestamp(end);
var rep = Resolver.Resolve<IEventRepository>();
var events = rep.ListEventsForUser(userName,fromDate,toDate);
var eventList = from e in events
select new
id = e.Id,
title = e.Title,
start = e.FromDate.ToString("s"),
end = e.ToDate.ToString("s"),
allDay = false
;
var rows = eventList.ToArray();
return Json(rows,JsonRequestBehavior.AllowGet);
编辑:
我现在正在使用 GetEvents 命令的以下 .cshtml 代码,但它不起作用。有人有什么想法吗?
@
var origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
var fromDate = origin.AddSeconds((Request["start"]));
var toDate = origin.AddSeconds(Request["end"]);
var db = Database.Open("events");
var result = db.Query("SELECT * FROM events");
var data = result.Select(x => new
id = x.id,
title = x.title,
start = x.start.ToString("s"),
end = x.end.ToString("s"),
allDay = false
).ToArray();
Json.Write(data, Response.Output);
Response.ContentType = "application/json";
【问题讨论】:
JavacriptSerializer
有什么问题?
在这种情况下我将如何使用 javascriptSerializer?
【参考方案1】:
WebMatrix 网页中没有控制器和操作。您需要编写一个单独的 .cshtml
页面来查询数据库并将 JSON 提供给响应:
@
var db = Database.Open("events");
var result = db.Query("SELECT * FROM events");
var data = result.Select(x => new
id = x.id,
title = x.title,
start = x.start.ToString("s"),
end = x.end.ToString("s"),
allDay = false
).ToArray();
Json.Write(data, Response.Output);
Response.ContentType = "application/json";
然后在要显示日历的另一个页面中进行配置:
$(document).ready(function()
$('#calendar').fullCalendar(
theme: true,
header:
left: '',
center: '',
right: ''
,
defaultView: 'agendaDay',
editable: false,
events: '/events.cshtml'
);
);
更新:这是一个如何使用参数化查询的示例:
@
var origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
var fromDate = origin.AddSeconds(int.Parse(Request["start"]));
var toDate = origin.AddSeconds(int.Parse(Request["end"]));
var db = Database.Open("events");
var sql = "SELECT * FROM events WHERE start >= @0 AND end <= @1";
var result = db.Query(sql, fromDate, toDate);
var data = result.Select(x => new
id = x.id,
title = x.title,
start = x.start.ToString("s"),
end = x.end.ToString("s"),
allDay = false
).ToArray();
Json.Write(data, Response.Output);
Response.ContentType = "application/json";
现在您可以像这样查询页面:/events.cshtml?start=5&end=10
【讨论】:
感谢您的回复。我已尝试将您的代码集成到我的代码中,但不幸的是,它似乎不起作用 - 没有为日历生成任何事件。我有两个理论 - 第一个是开始/结束时间的存储方式不同并且需要更改,第二个是在第一个 .cshtml 文件中,包含与数据库的连接,它似乎没有返回任何事物?你有什么想法吗,因为自从你的回应无济于事以来,我一直在努力!非常感谢您的回复:) 另外,在我上面的代码中,当前视图的开始和结束时间是作为参数提供的,但是在你的C#函数中,这个数据似乎根本没有用到? @SimonKiely,在您更新的答案中,您似乎使用的东西看起来不太像 C# 语法。您将 SQL 字符串与点连接起来。此外,您似乎正在使用未定义的变量调用ConvertFromUnixTimestamp
函数:start
和end
。如果您想从请求中读取此内容,您将使用 Request["start"]
和 Request["end"]
。我建议您首先在不使用其他过滤参数的情况下使其正常工作。此外,您将代码包装在 HTML 文件中,并且没有返回 JSON 数据。如果脚本发送正确的 JSON,还要查看 FireBug。
@SimonKiely,请参阅我更新的答案,了解如何正确使用网页的参数化查询的示例。您也可以在代码中放置断点并尝试对其进行调试。
是的,我完全同意你的观点,FireBug 很棒。如果您想为特定用户呈现它,您可以使用 SQL 查询中的用户名列来约束结果集。【参考方案2】:
DECLARE @listCol VARCHAR(2000)
DECLARE @query VARCHAR(4000)
SELECT @listCol = STUFF(( SELECT distinct '], [' + [PSize]
FROM Pattern
FOR
XML PATH('')
), 1, 2, '') + ']'
SET @query = 'SELECT * FROM
(SELECT PColour as Colour_Size_Matrix, PSize, PCode
FROM Pattern
) src
PIVOT (Count(PCode) FOR PSize
IN (' + @listCol + ')) AS pvt'
EXECUTE ( @query )
我希望此查询的结果为 JSON
【讨论】:
以上是关于从 SQL Server 数据库创建 JSON 结果的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 中读取 JSON 数据时无法从字符串转换为日期时间
如何使用 json 从 sql server ASP.net 中检索数据