使用Ajax每隔几秒将一些数据保存到数据库中

时间:2013-04-14 08:23:51

标签: asp.net sql sql-server ajax

我有一个页面,我必须每隔几秒钟将一些数据保存到数据库中。这类似于gmail或stackoverflow每隔几秒就保存一次草稿的方式。我正在使用jQuery Ajax来实现这一目标。以下是我的Ajax调用:

问题:这是正确的方法吗?我每隔几秒钟打开和关闭连接就不舒服了。

function ShowHtml() {
 var SaveStoryForEditing = '<%= Page.ResolveUrl("~")%>Webservices/WebService.asmx/SaveStoryForEditing';

            $('#savedata').html($('#InPlaceEdit').html());
            $("#InPlaceEdit").find("textarea").each(function (idx) {
                $("#savedata").find("textarea").eq(idx).text($(this).val());
            });
            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: SaveStoryForEditing,
                dataType: 'json',
                async: false,
                data: "{'StoryEditId':" + $('#hfStoryEditID').val() + ",'AccountId':" + $('#hfAccID').val() + ",'StoryHtml':'" + $('#savedata').html() + "'}", // Page parameter to make sure we load new data
                success: function (data) {
                    var myObject = eval('(' + data.d + ')');

                    $('#InPlaceEdit').effect("highlight", { color: "#ff0000" }, 1000);
                    $('#savedata').html('');
                    AutoSave();

                },
                error: function (result) {
                    AutoSave();
                    alert(JSON.stringify(result));
                }
            });

        };


        function AutoSave() {
            setTimeout("ShowHtml()", 30000);
        };

这是我从网络服务中调用的函数:

Public Shared Function SaveStoryForEditing(ByVal StoryEditId As Integer, ByVal AccountId As Integer, ByVal StoryHtml As String) As Object

        Dim db As SqlDatabase = Connection.Connection
        Dim scalar As Object
        Dim cmdIf As SqlCommand = CType(db.GetSqlStringCommand("UPDATE StoryEdit SET    StoryHtml=@StoryHtml WHERE AccountID=@AccountID AND StoryEditID=@StoryEditID"), SqlCommand)
        db.AddInParameter(cmdIf, "AccountID", DbType.Int32, AccountId)
        db.AddInParameter(cmdIf, "StoryEditID", DbType.Int32, StoryEditId)
        db.AddInParameter(cmdIf, "StoryHtml", DbType.String, StoryHtml)
        scalar = db.ExecuteNonQuery(cmdIf)
        Return scalar


    End Function

这是我的连接对象类:

Imports Microsoft.Practices.EnterpriseLibrary.Data.Sql
Imports System.Data.SqlClient

Public Class Connection
    Public Shared Function Connection() As SqlDatabase
        Dim db As SqlDatabase = New SqlDatabase(System.Configuration.ConfigurationManager.ConnectionStrings("TripNestConStr").ConnectionString)
        Return db
    End Function


    End Class

2 个答案:

答案 0 :(得分:2)

我认为这不是一个好方法。您正在创建(可能)不必要的流量。如果你真的需要这样的功能,我至少会考虑某种机制来跟踪变化并且只有在最后一次服务器调用之后发生了变化时才执行。如果数据没有改变,您实际上不需要向服务器发送请求并访问数据库。

您可以考虑一些想法,这完全取决于您的具体情况和需求。

答案 1 :(得分:1)

我在想为什么不使用隐藏字段类型的标志来检查值是否更新。在textarea的keypressup上,您可以将隐藏值设置为true。在autoSave方法中检查隐藏字段的值,如果为true,则只返回服务器。选择值后,再次将其更新回false。这样它可以帮助您节省一些时间过载。另一种方法是保存真假,而不是保存真假,你也可以保存更改的时间戳,并在javascript中有一个全局变量,它将告诉你最后一次在数据库中更新。如果过去的全局值与隐藏字段中的当前更新进行比较,则需要同步。