2013-04-14 63 views
0

我有一个页面,我必须每隔几秒保存一些数据[数据库]。这与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); 
     }; 

这是我从Web服务调用该函数:

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 [email protected] WHERE [email protected] AND [email protected]"), 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

你是对的,实际上我是动态构建这个表单并发现它很难跟踪更改。在不同的背景下,有什么办法可以进一步优化我的功能吗? – Monodeep

+0

@Monodeep,所以你的检查机制也必须是动态的。:)我知道这并不容易,但是...如果你正在寻找代码优化,我建议你看看CodeReview(姊妹网站)那里的人们可以提供有价值的见解。恐怕我不擅长用VB.NET来提供任何有关你的代码的严肃建议,例如我不明白为什么在VB中你不打开/关闭你的连接:))(或者至少我在你的例子中看不到这个机制) – walther

+0

感谢您的时间:)我打开/关闭我的连接在不同的功能,这是不是在这里。 – Monodeep

1

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

+0

谢谢,这是其他答案也表明。我将尽力实现这一点,我们很快就会更新。 – Monodeep