gpt4 book ai didi

asp.net - 如何设置 ASP.NET SQL 数据源以接受 TVP

转载 作者:行者123 更新时间:2023-12-02 02:48:08 26 4
gpt4 key购买 nike

在代码隐藏中,您可以将 TVP 添加为存储过程的 SqlDbType.Structured但这在 ASP.NET SqlDataSource 控件中不存在。

我已将数据表存储在 session 变量中(不用担心它们很小!),我需要将它们作为参数传递给 SqlDataSource(它有许多数据绑定(bind)对象)

我将数据源指向 session 变量,但转换为表类型时失败。

编辑:假设我将 Session 变量从方程中取出(因为,实际上,它完全是相切的)

必须有一种方法可以将 DBType.Structured 附加到 SQLDataSource。我的 ListView 适本地进行了数据绑定(bind),但它们所附加的存储过程必须采用 TVP

我不敢相信没有办法为 SQLDataSource 发送 TVP 参数?我有什么选择?

编辑2:我一直在考虑为 SqlDataSource 创建自定义参数,但在我看来,它的“eval”方法对结构化数据类型不满意

编辑3:开始看来,我唯一的选择是在代码隐藏中为我的数据绑定(bind)控件完成所有工作。我添加了赏金,以防其他人有一个优雅的解决方案。

编辑4:也许有一种方法可以将表作为对象传递给存储过程,然后让 SQL Server 将其转换为 TVP?

最佳答案

我知道您已经编辑说 session 并不重要,但是我能够使用 SessionParameter 来实现此目的。我有一种感觉,它也可以与 ControlParameter 一起使用。

因此您有一个用户定义的表类型:

CREATE TYPE TVPType AS TABLE(
Col1 int,
Col2 int)
GO

以及使用它的存储过程:

CREATE PROC TVPProc(@TVP AS TVPType READONLY) AS
SELECT * FROM @TVP

然后将 GridView 绑定(bind)到从存储过程中选择的 SqlDataSource,并传递 SessionParameter:

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" />
<asp:SqlDataSource ID="SqlDataSource1" SelectCommand="TVPProc" runat="server" SelectCommandType="StoredProcedure" ConnectionString="Server=(local)\sqlexpress;Database=Graph;Integrated Security=True">
<SelectParameters>
<asp:SessionParameter SessionField="MyDataTable" Name="TVP" />
</SelectParameters>
</asp:SqlDataSource>

最后是一些将 DataTable 放入 session 中的东西,尽管你说你已经在那里了:

(VB)

<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim MyDataTable As New System.Data.DataTable

MyDataTable.Columns.AddRange({
New System.Data.DataColumn("Col1", GetType(integer)),
New System.Data.DataColumn("Col2", GetType(integer))})

MyDataTable.Rows.Add(22, 33)
MyDataTable.Rows.Add(44, 55)
MyDataTable.Rows.Add(66, 77)

Session("MyDataTable") = MyDataTable
End Sub
</script>

(C#)

<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
System.Data.DataTable MyDataTable = new System.Data.DataTable();
MyDataTable.Columns.AddRange(
new System.Data.DataColumn[] {
new System.Data.DataColumn("Col1", typeof (int)),
new System.Data.DataColumn("Col2", typeof (int))});

MyDataTable.Rows.Add(22, 33);
MyDataTable.Rows.Add(44, 55);
MyDataTable.Rows.Add(66, 77);

Session["MyDataTable"] = MyDataTable;
}
</script>

这会产生精细绑定(bind)的 GridView:

alt text

以及从 Profiler 生成的以下查询:

declare @p1 dbo.TVPType
insert into @p1 values(22,33)
insert into @p1 values(44,55)
insert into @p1 values(66,77)

exec TVPProc @TVP=@p1

这是 .NET 4、MSSQL Express 2010,但也应该在较低版本下工作。

关于asp.net - 如何设置 ASP.NET SQL 数据源以接受 TVP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3233372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com