使用 jQuery 获取 MsSQL 的 rowversion 或 timestamp






4.60/5 (3投票s)
如何使用 jQuery 获取 MsSQL 的 rowversion 或 timestamp
引言
TIMESTAMP
/ROWVERSION
在表行中提供行版本控制功能。 这有助于我们管理多用户访问的同步(行更新)。 但是,当尝试使用 JSON.stringify()
将包含行版本值的特定对象序列化为 json string
,并使用 jquery Ajax 将该 string
发布到服务器时,问题就出现了。
问题是什么?
假设我们有一个变量 rowVersion
存储了 Rowversion
。
/*rowVersion from server*/
var rowVersion = [0, 0, 0, 0, 0, 0, 7, 209];
var json = '';
我们想使用 jquery Ajax 发布一个包含此 rowVersion
的特定对象的 JSON.stringify()
格式的 json。
/*this json post would fail, at server RowVersion is null*/
var normalPostObj = {
RowVersion: rowVersion
};
json = JSON.stringify(normalPostObj);
alert(json);
但是,在服务器上发布的 rowVersion
是 null
。 即使我们发布对象本身而不是 json string
,结果也是一样的。
我们能做什么?
用于处理行版本的扩展
/*rowVersion helper*/
$.timeStampToBase64String = function(data) {
var str = String.fromCharCode.apply(null, data);
return btoa(str);
};
在 post
对象中使用此扩展来格式化 rowVersion
,如下所示:
/*this json post would work just fine, at server rowVersion is as..*/
var modifiedPostObj = {
RowVersion: $.timeStampToBase64String(rowVersion)
};
json = JSON.stringify(modifiedPostObj);
alert(json);
我们能在 Knockout Mapper 中使用它吗?
要对 Knockout mapper 执行相同的操作,我们必须在 replacer 函数中使用此扩展,如下所示:
/*Use for knockout =>*/
var timestampReplacer = function(key, value) {
/*if any property with name RowVersion at the object convert its value*/
if (key === 'RowVersion' && Array.isArray(value)) {
return $.timeStampToBase64String(value);
}
return value;
};
并在 knockout 中使用此 replacer 函数,如下所示:
/*important: using normalPostObj rather than the modifiedPostObj*/
json = ko.toJSON(normalPostObj, timestampReplacer);
alert(json);
请查看 http://jsfiddle.net/DiponRoy/EUeq3/6/ 以快速预览。
附件中包含一个 MVC 项目的 Visual Studio 2012 解决方案。 在该项目中,我使用了实体框架代码优先方法。 因此,如果您运行该项目
- 将创建一个名为
DbRowVersion
的数据库(从 web.config 中更改它) - 以及包含一些种子数据的表
Student
或者,按照我们刚才讨论的示例操作。 它也能正常工作。