У меня есть эта процедура
CREATE PROCEDURE dbo.spProcedure1
@intArray as dbo.intArray READONLY
AS
BEGIN
-- ...
END
которые используют тип пользователя в качестве параметра
CREATE TYPE dbo.IntArray AS TABLE (IntValue int NULL)
и я вызываю процедуру из проекта C # ASP.NET MVC 4
// creating empty SQL @IntArray parameter
var emptyIntDataTable = new DataTable();
emptyIntDataTable.Columns.Add("IntValue");
// calling stored procedure
return Database.SqlQuery<int>(
@"spProcedure1 @p1",
new SqlParameter("p1", (object)Utils.ToDataTable(m.IntArray) ?? emptyIntDataTable)
).ToList();
// ToDataTable method which is returning null
public static DataTable ToDataTable<T>(this IList<T> data)
{
if (data == null)
return null;
... // code omitted because it is not working yet
}
ошибка, возникающая при вызове хранимой процедуры,
Параметр типа таблицы «p1» должен иметь допустимое имя типа.
Как передать пустое табличное значение?
Передача списка вместо datatable вызывает следующую ошибку
var emptyIntDataTable = new List<int>;
Не существует сопоставления типа объекта System.Collections.Generic.List`1 [[System.Int32, mscorlib, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089]] с собственным типом известного управляемого поставщика.
Select * From @aIDs) все еще работает. - person Charles Bretana   schedule 31.08.2016@"spProcedure1 @p1",указан параметр, поэтому я не могу пропустить этот параметр во втором параметреnew SqlParameter(метода SqlQuery. Ответ на вопросwhy don't you just code the SP to handle an empty datatable, if the parameter is missingзаключается в том, что я уже делаю это с помощью оператора??, но пустая таблица данных не работает. - person Muflix   schedule 31.08.2016if? У C # есть такая возможность. Где бы ни была эта строка кода, поместите ДВЕ из них: одну, если в списке есть что-то (как есть), и одну БЕЗ параметра @ p1. - person Charles Bretana   schedule 31.08.2016