【问题标题】:sqlQuery string wtih Ajax使用 Ajax 的 sql 查询字符串
【发布时间】:2020-02-27 20:26:54
【问题描述】:

我正在尝试使用查询字符串进行 Ajax 调用,但是我已经完成了一半,现在卡住了要做什么,我正在尝试使用 javascript 可排序函数更新 SQL 表。一旦项目向上或向下移动,我就会通过 ajax 并让它在 SQL 中更新。 (好吧,这就是我想要做的) 想知道你们是否可以帮忙。

  <script>
      $("#tableBody").sortable({
          connectWith: "#tableBody",
          update: function (event, ui) {
              // this.id = #tableBody
              //  ui.item = Dragged item
              console.log(ui.item.attr("data-id"));
              console.log(ui.item.attr("data-prod-id"));
              console.log(ui.item.index());
            $.get('shop_prod_options_update_sort_order.aspx?id=' + id + '&prodid=' + prodid + '&sortorder=' + sortorder);
          }
      });
  </script>
<Script Language="VB" RunAt="Server">

    Dim intOptionId As Integer = 1
    Dim intProdId As Integer = 1
    Dim intNewSortOrder As Integer = 0
    Dim intOldSortOrder As Integer = 0

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If IsNumeric(Request.QueryString("id")) Then
            intOptionId = Val(Request.QueryString("id"))
        End If

        If Request.QueryString("sortorder") = "sortorder" Then
            intOptionId = True
        Else
            intOptionId = False
        End If

        If Not IsPostBack Then

            UpdateList()

        End If

    End Sub

    Private Sub UpdateList()

        Dim connDBConnection As SqlConnection = Nothing
        Dim commDBCommand As SqlCommand
        Dim strSQLQuery As String = ""

        '''''''''''''''''''''''''''''''
        Try

            strSQLQuery =   "SELECT option_order FROM shop_option WHERE option_id = @option_id"
            Using connConnnection As New SqlConnection(Database.GetDatabaseConnString)
                connConnnection.Open()
                Using commCommand As New SqlCommand(strSQLQuery,connConnnection)
                    commCommand.Parameters.AddWithValue("@option_id", intOptionId)
                    intOldSortOrder = commCommand.ExecuteScalar()
                End Using
            End Using


            If intOldSortOrder>intNewSortOrder Then
                strSQLQuery =   "UPDATE option_order FROM shop_option WHERE option_id = @option_id", intOptionId
                strSQLQuery +=   "SET option_order = option_order + 1 FROM shop_option WHERE option_id = @option_id", intOptionId
            Else
                strSQLQuery =   "UPDATE option_order FROM shop_option WHERE option_id = @option_id;", intOptionId
                strSQLQuery +=   "SET option_order = option_order - 1 FROM shop_option WHERE option_id = @option_id", intOptionId
            End If

            Using connConnnection As New SqlConnection(Database.GetDatabaseConnString)
                connConnnection.Open()
                Using commCommand As New SqlCommand(strSQLQuery,connConnnection)
                    commCommand.Parameters.AddWithValue("@option_id", intOptionId)
                    intOldSortOrder = commCommand.ExecuteScalar()
                End Using
            End Using


        Catch ex As Exception

        Finally
            Database.Disconnect(connDBConnection)
        End Try

    End Sub
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
       
    </head>

    <body>
        <form id="form1" runat="server">
            
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
                
                
        </form>
    </body>
</html>

【问题讨论】:

  • 您遇到了什么问题?
  • @ChetanRanpariya 我遇到的问题是,我从数据库中获取了一个列表。使用 javascript 中的 sortable,它允许我拖放列表中的项目。尝试从 ajax 调用更新数据库并将新移动的项目设置在数据库中。希望这是有道理的
  • 一个空的Catch是魔鬼的工作室。
  • 这条线在做什么? strSQLQuery = "UPDATE option_order FROM shop_option WHERE option_id = @option_id", intOptionId 我认为不会编译。
  • strSQLQuery += "SET option_order = option_order + 1 FROM shop_option WHERE option_id = @option_id", intOptionId 同样,这不会编译。 & 号是 vb.net 中的字符串连接运算符。尽管“+”会起作用,但您可能会得到意想不到的结果。将此字符串添加到第一个字符串不会生成有效的 sql 命令。

标签: javascript sql ajax vb.net


【解决方案1】:

我不确定Page_Load 的东西,但我已经整理了UpdateList() 方法。

将连接和命令组合成一个 Using 块。

.AddWithValue 更改为.Add 方法。见http://www.dbdelta.com/addwithvalue-is-evil/https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ 还有一个: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications 这是另一个 https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html

将连接.Open 移至.Execute 之前。

.ExecuteScalar 方法返回一个对象,所以我添加了CInt 以满足Option Strict

更正了您的 Update 语法。

更新命令不是用.ExecuteScalar 而是用.ExecuteNonQuery 执行的。

摆脱了Try...Catch...Finally,因为它除了吞咽错误什么也没做。由于您使用的是 Using 块,我不知道 Database.Disconnect(connDBConnection) 应该做什么。

Dim intOptionId As Integer = 1
Dim intProdId As Integer = 1
Dim intNewSortOrder As Integer = 0
Dim intOldSortOrder As Integer = 0

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Integer.TryParse(Request.QueryString("id"), intOptionId)
    'Not sure what you are doing here but intOptionID is declared as an Integer
    'and cannot take a Boolean value.
    'If Request.QueryString("sortorder") = "sortorder" Then
    '    intOptionId = True
    'Else
    '    intOptionId = False
    'End If
    If Not IsPostBack Then
        UpdateList()
    End If
End Sub

Private Sub UpdateList()
    Dim strSQLQuery = "SELECT option_order FROM shop_option WHERE option_id = @option_id"
    Using connConnnection As New SqlConnection(Database.GetDatabaseConnString),
                commCommand As New SqlCommand(strSQLQuery, connConnnection)
        commCommand.Parameters.Add("@option_id", SqlDbType.Int).Value = intOptionId
        connConnnection.Open()
        intOldSortOrder = CInt(commCommand.ExecuteScalar())
    End Using
    If intOldSortOrder > intNewSortOrder Then
        strSQLQuery = "UPDATE shop_option SET option_order = option_order + 1 WHERE option_id = @option_id"
    Else
        strSQLQuery = "UPDATE shop_option SET option_order = option_order - 1 WHERE option_id = @option_id;"
    End If
    Using connConnnection As New SqlConnection(Database.GetDatabaseConnString),
                commCommand As New SqlCommand(strSQLQuery, connConnnection)
        commCommand.Parameters.Add("@option_id", SqlDbType.Int).Value = intOptionId
        connConnnection.Open()
        commCommand.ExecuteNonQuery()
    End Using
End Sub

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多