Как передать значение по умолчанию для параметра sp с помощью метода TableAdapter Fill - PullRequest
1 голос
/ 15 мая 2019

Технология 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 является командой 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 

В некоторых контекстах моего приложения у меня нет подходящего объекта DataTable для параметра @My_Data. Я хотел бы иметь возможность запустить мой sp с @My_Context = 1, в котором мне не нужна таблица данных для моих расчетов.

Похоже, я не могу передать ничего в мою функцию Fill, так как табличные параметры не принимают значения NULL. Как я прочитал здесь , я могу передать default в качестве параметра на стороне sql для пропуска надлежащей пустой таблицы.

Моя проблема заключается в том, как заставить метод Fill TableAdapter передать значение по умолчанию для сервера sql.

Мой обходной путь - подготовить правильный фиктивный объект DataTable для передачи, когда его нет, но я надеюсь, что есть более приятный подход.

Заранее спасибо!

1 Ответ

0 голосов
/ 15 мая 2019

Как я уже сказал в своем (теперь удаленном) комментарии, вам все равно нужно указать параметр @My_Data, но в нем не должно быть никаких строк. Синтаксис, подобный приведенному ниже, вполне приемлем:

DECLARE @My_Data dbo.myTableValuedType;

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

У меня нет INSERT строк в @My_Data, но параметр все еще передается, он просто пуст. В вашем случае вы все равно объявляете параметр в VB.Net, но это все; вы бы не заполнили его набором данных.

В терминах параметров Table-Value пустая таблица фактически является эквивалентом непередачи параметра (если он имеет значение по умолчанию) для скалярного параметра.

Edit:

Мой VB.Net не очень хорош, но я думаю, вы бы создали пустой набор данных для передачи в параметр табличного значения как-то так:

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 будет знать, если это не так.

Я понимаю, что это должно быть в Using или что-то в этом роде, но я не программист VB.Net, поэтому я работаю над основами из Google, документацией и некоторыми (старыми) знаниями из мои VB6 дней.

...