2012-09-25 46 views
12

Estoy escribiendo un procedimiento almacenado C# que se implementa en SQL Server 2008 R2 (por lo que .Net 3.5) y desea declarar un opcional parámetro como guid anulable. Esto es lo que he intentado en primer lugar:Cómo declarar un guid con nulos como un parámetro opcional para un procedimiento almacenado C# CLR con SQL Server

Esta fallado con el error de tiempo de compilación:

Default parameter value for 'sID' must be a compile-time constant

que es porque DBNull.Value no es una constante, que es un dolor.

así que he intentado cambiar la declaración de:

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void spCalcPerc(
    SqlGuid pID 
    , Guid? sID = null 
    ) 

Esto compila pero ahora me sale este error de implementación:

Deploy error : Could not create a type for parameter System.Nullable

Tratando:

, SqlGuid sID = null 

da este error en tiempo de compilación :

A value of type '< null >' cannot be used as a default parameter because there are no standard conversions to type 'System.Data.SqlTypes.SqlGuid'

Así sentirse bien pegado recurrí a esto:

, SqlGuid sID = "00000000-0000-0000-0000-000000000000" 

que yo no quiero hacer como prueba de esa cadena en el código se siente como un kludge. Sin embargo eso no funciona ya sea como me sale este error de compilación:

A value of type 'string' cannot be used as a default parameter because there are no standard conversions to type 'System.Guid'

Gah, 4 enfoques diferentes y ninguno de ellos trabajan. suspiro

Agradeceríamos sus ideas o un empujón en la dirección correcta, por favor.

+0

¿Has probado "Guid? SID", sin = null? – H27studio

Respuesta

0

¿Hay algo de malo con solo pasar Nulls por los valores que desea por defecto?
De acuerdo, esto puede no funcionar en todas las situaciones.
Algunas veces es posible que desee saber si el valor real es nulo y, por lo tanto, evite usar el valor predeterminado.
Si este es el caso, entonces recurriría a agregar un parámetro adicional "Predeterminado".

[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; 
} 

Esto ahorra tener que escribir adicional " envoltorio" sprocs tomar en parámetros opcionales con valores predeterminados que luego llame a su sproc CLR.

Para utilizar el valor predeterminado de valor cuando Null pase en: UseDefault_pID = 1
Para mantener el actual valor de y cuando Null pase en: UseDefault_pID = 0

0

Sólo declaran como:

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void spCalcPerc(
    SqlGuid pID 
    , SqlGuid sID 
    ) 

y luego registrarlo manualmente en SQL Server:

ALTER PROCEDURE [dbo].[spCalcPerc] 
    @pID [uniqueidentifier], 
    @sID [uniqueidentifier] = null 
WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [SqlServerProject3].[StoredProcedures].[spCalcPerc] 

y entonces se puede utilizar la propiedad IsNull para probar whet su sID es de hecho nulo:

SqlContext.Pipe.Send(sID.IsNull.ToString()); 

No estoy al tanto de una forma de declarar el valor por defecto en su código C#, me temo.

0

no lo probé, pero lo intenta

Guid.Empty 

?

+3

Produciría el mismo error que el primero: "El valor de parámetro predeterminado para 'sID' debe ser una constante de tiempo de compilación" - ya que 'Guid.Empty' no es una constante de tiempo de compilación. –

0

Como ha señalado, esto se debe a que C# 2.0 no admite parámetros opcionales.

Una solución alternativa puede ser ajustar los procedimientos almacenados de .NET en procedimientos almacenados de T-SQL regulares que aceptan parámetros predeterminados.

Por ejemplo:

CREATE PROCEDURE TestProcWrapper 
(
    @TestIntWrapperParam int = null 
) 
AS 
EXEC TestProc @TestInt = @TestIntWrapperParam 
4

Trate

, SqlGuid sID = New Guid() 

Puede utilizar

if (sID == Guid.Empty) 

Para comprobar si se no se ha asignado un valor.

0

Compruebe si el valor nulo es el siguiente.

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void spCalcPerc(SqlGuid pID) 
{ 
    // check for null or set default 
    Guid refId = pID.IsNull ? Guid.NewGuid() : pID.Value; 
Cuestiones relacionadas