Ответ 1
Попробуйте
, SqlGuid sID = New Guid()
Вы можете использовать
if (sID == Guid.Empty)
Чтобы проверить, не присвоено ли ему значение.
Я пишу хранимую процедуру С#, которая развернута на SQL Server 2008 R2 (так .Net 3.5) и хочу объявить необязательный параметр как nullable guid. Вот что я пробовал первым:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
SqlGuid pID
, SqlGuid sID = DBNull.Value
)
Это не удалось с ошибкой времени компиляции:
Значение параметра по умолчанию для 'sID' должно быть константой времени компиляции
потому что DBNull.Value
не является константой, которая является болью.
Поэтому я попытался изменить объявление на:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
SqlGuid pID
, Guid? sID = null
)
Это компилируется, но теперь я получаю эту ошибку развертывания:
Ошибка развертывания: не удалось создать тип для параметра System.Nullable
Попытка:
, SqlGuid sID = null
Дает эту ошибку времени компиляции:
Значение типа '<null> 'не может использоваться как параметр по умолчанию, потому что нет стандартных преобразований для типа 'System.Data.SqlTypes.SqlGuid'
Так что, чувствуя себя довольно застрявшим, я прибегал к этому:
, SqlGuid sID = "00000000-0000-0000-0000-000000000000"
Что я не хотел делать, так как тестирование этой строки в коде выглядит как kludge. Однако это не работает, поскольку я получаю эту ошибку компиляции:
Значение типа 'string' не может использоваться как параметр по умолчанию, потому что нет стандартных преобразований для типа 'System.Guid'
Gah, 4 разных подхода, и никто из них не работает. Вздох
Поблагодарите ваши мысли или толчок в правильном направлении, пожалуйста.
Попробуйте
, SqlGuid sID = New Guid()
Вы можете использовать
if (sID == Guid.Empty)
Чтобы проверить, не присвоено ли ему значение.
Есть ли что-то не так, просто передавая в Nulls значения, которые вы хотите по умолчанию?
Конечно, это может не работать в любой ситуации.
Иногда вам может потребоваться узнать, действительно ли фактическое значение Null, и, следовательно, не использовать значение по умолчанию.
Если это так, тогда я прибегну к добавлению дополнительного параметра "Default".
[Microsoft.SqlServer.Server.SqlProcedure]
public static void MySproc(SqlGuid pID, SqlGuid sID, SqlBoolean UseDefault_sID)
{
sID = (UseDefault_sID == SqlBoolean.True && sID == SqlGuid.Null)
? SomeDefaultPIDValue : sID;
}
Это избавляет от необходимости записывать дополнительные "обертки" sprocs для получения необязательных параметров со значениями по умолчанию, которые затем вызывают CLR sproc.
Использовать значение по умолчанию при переходе нулевого значения: UseDefault_pID = 1
Чтобы сохранить фактическое значение при переходе нулевого значения: UseDefault_pID = 0
Просто объявите его как:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
SqlGuid pID
, SqlGuid sID
)
И затем зарегистрируйте его вручную в SQL Server:
ALTER PROCEDURE [dbo].[spCalcPerc]
@pID [uniqueidentifier],
@sID [uniqueidentifier] = null
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlServerProject3].[StoredProcedures].[spCalcPerc]
И затем вы можете использовать свойство IsNull
, чтобы проверить, действительно ли sID
null:
SqlContext.Pipe.Send(sID.IsNull.ToString());
Я не знаю, как мне объявить по умолчанию код С#.
Я не пробовал, но вы попробовали
Guid.Empty
?
Как вы указали, это связано с тем, что С# 2.0 не поддерживает необязательные параметры.
Обходным способом может быть обертка хранимых процедур .NET в обычных хранимых процедурах T-SQL, которые принимают параметры по умолчанию.
Например:
CREATE PROCEDURE TestProcWrapper
(
@TestIntWrapperParam int = null
)
AS
EXEC TestProc @TestInt = @TestIntWrapperParam
Проверьте значение null следующим образом.
[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(SqlGuid pID)
{
// check for null or set default
Guid refId = pID.IsNull ? Guid.NewGuid() : pID.Value;