65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 jQuery 获取 MsSQL 的 rowversion 或 timestamp

2014年7月21日

CPOL

1分钟阅读

viewsIcon

10886

downloadIcon

71

如何使用 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);

但是,在服务器上发布的 rowVersionnull。 即使我们发布对象本身而不是 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 解决方案。 在该项目中,我使用了实体框架代码优先方法。 因此,如果您运行该项目

  1. 将创建一个名为 DbRowVersion 的数据库(从 web.config 中更改它)
  2. 以及包含一些种子数据的表 Student

或者,按照我们刚才讨论的示例操作。 它也能正常工作。

© . All rights reserved.