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" 中。如何将此值放入更新参数?
我在想几个办法:
- 想办法让 SQL 参数以某种方式取那个值
- 使用正常的 SQL 更新覆盖更新命令。但我想保留乐观并发特性。
我假设您正在使用 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 更新之前添加那些自定义参数
我正在使用带有 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" 中。如何将此值放入更新参数?
我在想几个办法:
- 想办法让 SQL 参数以某种方式取那个值
- 使用正常的 SQL 更新覆盖更新命令。但我想保留乐观并发特性。
我假设您正在使用 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 更新之前添加那些自定义参数