如何通过TableAdapter填充方法传递sp参数的默认值

时间:2019-05-15 09:47:42

标签: .net sql-server vb.net tableadapter

技术是VB.Net和Sql Server。 我有一个存储过程

CREATE OR ALTER PROC [dbo].[sp_bring_some_data] 
    (        
      @My_Data as myTableValuedType READONLY,
      @My_Context as bit
    )
    AS
    BEGIN
      IF @My_Context = 0 
        BEGIN
          -- this sp accepts a table-valued params
          EXEC sp_bring_some_data_0 @My_Inner_Data = @My_Data
        END
      ELSE
        BEGIN
          -- this sp is parameterless
          EXEC sp_bring_some_data_b
        END
    END

此sp是TableAdapter的SelectCommand。当然,自动生成的填充方法具有三个参数:

Public Overloads Overridable Function Fill(ByVal dataTable As ds.sp_fill_some_dataDataTable, ByVal My_Data As Object, ByVal My_Context As Global.System.Nullable(Of Boolean)) As Integer 

在我的应用程序的某些上下文中,我没有用于@My_Data参数的正确的DataTable对象。我希望能够使用@My_Context = 1运行我的sp,在其中我不需要数据表来进行计算。

似乎我无法将Nothing传递给我的Fill函数,因为表值参数不接受空值。 正如我读过here一样,我可以在SQL端将default作为参数传递给适当的空表。

我的问题是如何强制TableAdapter的Fill方法通过默认的sql服务器。

我的解决方法是准备一个合适的虚拟DataTable,以在没有真实的DataTable时通过,但我希望有更好的方法。

谢谢!

1 个答案:

答案 0 :(得分:0)

就像我在我的评论(现在已删除)中说的那样,您仍然需要提供参数@My_Data,但是它不必包含任何行。完全可以接受以下语法:

DECLARE @My_Data dbo.myTableValuedType;

EXEC [dbo].[sp_bring_some_data], @My_Data, 1;

我没有将INSERT的任何行@My_Data插入Dim sqlConn As New SqlConnection(connString) Dim sqlComm As New SqlCommand("dbo.sp_bring_some_data", sqlConn) sqlComm.CommandType = CommandType.StoredProcedure Dim dt As New DataTable Dim dr As DataRow dt.Columns.Add("IDColumn",Type.GetType("System.Int32")) dt.Columns.Add("Column1",Type.GetType("System.String")) sqlComm.Parameters.AddWithValue("@My_Data",dt) sqlComm.Parameters.Add(New SqlParameter("@My_Context ", SqlDbType.Bit)) sqlComm.Parameters("@My_Context ").Value = chkMyCheckBox.Value 'Don't know if that works in VB.net in truth, I assume it does ,但该参数仍被传递,只是空的。在您的情况下,您仍然可以在VB.Net中声明该参数,仅此而已;您不会用数据集填充它。

用表值参数术语来说,空表实际上等同于不传递标量参数的参数(当它具有默认值时)。

编辑:

我的VB.Net不好,但是我想您会创建一个空的数据集,以便像这样传递给表值参数:

Using

因此,我生成了数据表,但从未填充它。 VB.Net上更好的人会知道这是否是错误的。

我意识到这应该是for (Agagf x : list) { create(x); } // ------------------------ public static void create(Object obj) throws DatabaseException { Session hsession = null; try { hsession = SqlDataHibernateUtil.getSessionFactory().openSession(); Transaction htransaction = hsession.beginTransaction(); hsession.save(obj); htransaction.commit(); } catch (HibernateException ex) { throw new DatabaseException(ex); } finally { if (hsession != null) hsession.close(); } } 之类的东西,但是就像我不是VB.Net程序员一样,所以我正在研究Googling,文档和一些(旧的)基础知识。从我的VB6天中学到的知识。