9

分離コードでは、ストアド プロシージャの SqlDbType.Structured として TVP を追加しますが、これは ASP.NET SqlDataSource コントロールには存在しません。

Datatables をセッション変数に保存しました (小さいので心配しないでください!)。それらをパラメーターとして SqlDataSource (多数のデータバインド オブジェクトを持つ) に渡す必要があります。

Datasource をセッション変数に指定しましたが、テーブル型への変換に失敗します。

編集:セッション変数を方程式から外したとしましょう(実際には、完全に接しているため)

DBType.Structured を SQLDataSource にアタッチする方法が必要です。リストビューは適切にデータバインドされていますが、それらが接続されているストア プロシージャは TVP を使用する必要があります

SQLDataSource の TVP パラメータを送信する方法がないとは信じられませんか? 私の代替手段は何ですか?

EDIT2: SqlDataSource のカスタム パラメーターの作成を検討してきましたが、その「eval」メソッドが構造化されたデータ型に満足できないように思えます

EDIT3: 私の唯一のオプションは、データ バインドされたコントロールのコード ビハインドですべての作業を行うことであると思われ始めています。他の誰かがエレガントなソリューションを持っている場合に備えて、賞金を追加しました。

EDIT4:おそらく、テーブルをオブジェクトとしてストアド プロシージャに渡し、SQL Server でそれを TVP に変換する方法はありますか?

4

2 に答える 2

6

セッションは重要ではないと編集したことは知っていますが、SessionParameterを使用してこれを機能させることができました。ControlParameter でも機能すると思います。

したがって、ユーザー定義のテーブル型があります。

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

およびそれを使用するストアド プロシージャ:

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

次に、sproc から選択する SqlDataSource にバインドされた GridView で、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 をセッションに入れるためのちょっとしたことですが、とにかく既にそこにあると言っています。

(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>

これにより、細かくバインドされた GridView が生成されます。

代替テキスト

そして、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 ですが、それ以下でも動作するはずです。

于 2010-08-31T17:10:52.210 に答える
0

すでに持っている自動データ境界のソースとして機能する中間クラスまたはアダプターを作成します。次に、必要な方法で sproc の引数を完全に制御できます。

于 2010-08-26T10:44:21.860 に答える