VB.net - 在 SQL 更新命令中传递自定义参数

VB.net - Pass Custom Parameter in SQL Update Command

我正在使用带有 SQLDataSource Select/Insert/Update 命令的 Gridview。它适用于使用 Gridview 更新或更改值。但是最近我添加了另一个使用 Javascript 检索数据的插件,我需要检索数据作为 SQL 的源数据。我有什么办法可以做到这一点?

像这样:

<form id="form1" runat="server">
    <div>
    <input type="hidden" id="newname" runat="server" />
    <br />
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID_AM" DataSourceID="SqlDataSource1">
        <Columns>
            <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:BoundField DataField="StaffID" HeaderText="StaffID" SortExpression="StaffID" />
        </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
         SelectCommand="SELECT [ID], [Name], [StaffID] FROM [Record]"        
         ConflictDetection="CompareAllValues" 
         UpdateCommand="UPDATE [Record] SET [Name] = @Name, [StaffID] = @StaffID WHERE [ID] = @original_ID AND (([Name] = @original_Name) OR ([Name] IS NULL AND @original_Name IS NULL)) AND (([StaffID] = @original_StaffID) OR ([StaffID] IS NULL AND @original_StaffID IS NULL))">
        <UpdateParameters>
            <asp:Parameter Name="Name" Type="String" />
            <asp:Parameter Name="StaffID" Type="String" />
            <asp:Parameter Name="original_ID" Type="Int32" />
            <asp:Parameter Name="original_Name" Type="String" />
            <asp:Parameter Name="original_StaffID" Type="String" />
        </UpdateParameters>
    </asp:SqlDataSource>
</div>
</form>

当我使用 Gridview 更新行时,插件将生成一个新名称并存储在隐藏输入 "newname.value" 中。如何将此值放入更新参数?

我在想几个办法:

我假设您正在使用 asp.net 网络表单,据说没有(简单的)方法可以使服务器端 asp.net 数据源与客户端 javascript 接口,没有基于 javascript 插件编写自己的 asp.net 控件。

也就是说,我发现最简单的方法是使用 webmethods。如果您更喜欢使用 Jquery,请参阅此 link. If you want asp.net to do the heavy lifting see this link。我更喜欢 link 2,所以这里是重点:

首先,您需要在页面中添加一个 scriptManager,它将 "write" javascript 函数用于对服务器端 webmethods 进行异步调用,这将在您的 aspx 文件中:

<head runat="server">
    <title></title>
    <script type="text/javascript">
        function HandleIT() {
            var name = document.getElementById('<%=txtname.ClientID %>').value;
            var address = document.getElementById('<%=txtaddress.ClientID %>').value;
            PageMethods.ProcessIT(name, address, onSucess, onError); 
            function onSucess(result) {
                alert(result);
            }
            function onError(result) {
                alert('Something wrong.');
            }
        }
    </script>
</head>
<div>
        <p>Say bye-bey to Postbacks.</p>

        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>
        <asp:TextBox ID="txtname" runat="server"></asp:TextBox>
        <br />
        <asp:TextBox ID="txtaddress" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="btnCreateAccount" runat="server" Text="Signup" OnClientClick="HandleIT(); return false;" />
    </div>

这是网络方法,(这将在您的 .aspx.vb 文件中):

Imports System.Web.Services
<WebMethod> _
Public Shared Function ProcessIT(name As String, address As String) As String
    Dim result As String = (Convert.ToString((Convert.ToString("Welcome Mr. ") & name) + ". Your address is '") & address) + "'."
    Return result
End Function

您可以为每个 sql 查询创建一个网络方法,但即便如此,我认为您也无法引用那些 SqlDataSource 对象。您将需要使用不同的方式通过 vb.net 提取数据,然后 return 从网络方法中提取数据。

Webmethods 使用 JSON 发送和接收对象,这意味着它们为您序列化和反序列化对象到 JSON 和从中反序列化对象。我发现与 return 到 javascript 最兼容的对象类型是 list(of dictionary(of string, object))) 所以你的 JSON 看起来像这样:

[{"ID": 6, "Name":"sec0ndHand","StaffId" : "employeeOfTheMonth1"},{"ID": 3, "Name":"Tomy","StaffId" : "notEmployeeOfTheMonth1"}]

所以你的网络方法最后看起来像这样:

<WebMethod> _
Public Shared Function ProcessIT(name As String, address As String) As list(of dictionary(of string, object)))
    Dim result As list(of dictionary(of string, object))) = New list(of dictionary(of string, object)))
    'get/update/delete/insert your data

    'convert your return object into list(of dictionary(of string, object)))
    Return result
End Function

感谢您的回答。后来我找到了一种更直接的方法,似乎更容易,而且似乎适合我的情况。

我只是在更新事件上添加了参数:

Protected Sub SQL_Update(source As Object, e As SqlDataSourceCommandEventArgs) Handles SqlDataSource.Updating

    dim staffid as string = newname.valie
    // presudo for other passing values

    e.Command.Parameters("@StaffID").Value = staffid
    //and for other parameters

End Sub

然后可以在执行 SQL 更新之前添加那些自定义参数