2009-12-02 15 views
5

Así que aquí está el trato. En nuestra base de datos, envolvemos la mayoría de nuestras lecturas (es decir, seleccionamos declaraciones) en funciones con valores de tabla para propósitos de seguridad y modularidad. Así que tengo un TVF que define uno o más parámetros opcionales.Cómo pasar la palabra clave predeterminada para la función de tabla llamada en ADO.NET

Creo que tener un TVF con los parámetros de default exige el uso de la palabra clave default al llamar a la TVF así:

select * from fn_SampleTVF(123, DEFAULT, DEFAULT) 

Eso está bien, todo funciona en el analizador de consultas, pero cuando llega el momento de realidad realizar esta solicitud desde ADO.NET, no estoy seguro de cómo crear un parámetro sql que realmente coloque la palabra default en el sql representado.

tengo algo más o menos así ahora:

String qry = "select * from fn_SampleTVF(@requiredParam, @optionalParam)"; 

DbCommand command = this.CreateStoreCommand(qry, CommandType.Text); 

SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
someRequiredParam.Value = 123; 
command.Parameters.Add(someRequiredParam); 

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

Así que, ¿Alguien tiene alguna idea de cómo pasar a la default TVF?

+1

La mejor solución que he visto hasta ahora, es evitar el uso de las cláusulas de incumplimiento en la definición de los parámetros de TVF, pasar nulos como Kevin sugirió, y crear manualmente los valores predeterminados en su cuerpo TVF. Aquí hay un artículo que encontré (se trata de Sprocs, pero el problema es el mismo). http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/3825fe1c-7b7e-4642-826b-ea024804f807 Como con todas las otras cosas asociadas con Microsoft, hacer que esto funcione supondrá la mitad -la solución alternativa. – Mason

Respuesta

0

Puede pasar Null como el valor del parámetro.

Este artículo muestra ejemplos: http://support.microsoft.com/kb/321902

+0

Gracias, intentaré eso, pero estoy bastante seguro de que pasar un nulo explícito anulará los valores predeterminados definidos en la definición de tvf, haciendo que los valores predeterminados sean inútiles. – Mason

+0

Me encantaría escuchar sus hallazgos. Me sorprende que nunca haya necesitado saber esto antes de ver tu pregunta. Todavía esperaría que Null funcionara y que DBNull anularía la definición del paramater. –

+0

Sí, acabo de comprobar, eso no está bien. Y la razón es porque hay una diferencia entre: seleccionar * de fn_SampleTVF (123, DEFAULT) y seleccionar * de fn_SampleTVF (123, null) Gracias embargo. – Mason

3
SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

Usted no tiene que agregar el código anterior (El parámetro opcional) para predeterminado. SQL Server usará el predeterminado como se define en su UDF. Sin embargo si le gustaría pasar valor diferente, entonces se puede pasar:

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = newValue; 
command.Parameters.Add(optionalParam); 
+0

Además, parece (de mis pruebas hasta el momento) que ni siquiera tiene que especificar el tipo de datos; para que pueda decir: command.Parameters.Add (new SqlParameter ("@ OptionalParam", null)); ...y el [nulo] se interpretará como [predeterminado] – tbone

+1

EDITAR: mi comentario anterior es incorrecto: [nulo] ** no se interpreta como [predeterminado] – tbone

+0

Ok, después de aún más pruebas, al menos con la versión de marco actual Estoy usando, agregando el parámetro sin especificar que un valor NO da como resultado que se use el valor predeterminado. Llamar desde SSMS con [predeterminado] no produce el mismo resultado que pasar el parámetro sin valor, aunque ese es el comportamiento implícito aquí: https://msdn.microsoft.com/en-us/library/system.data. sqlclient.sqlparameter.value% 28v = vs.110% 29.aspx – tbone

1

lo habría hecho así:

public void YourMethod(int rparam, int? oparam = null) 
{ 
    String qry = string.Format("select * from fn_SampleTVF(@requiredParam, {0})" 
     , !oparam.HasValue ? "default" : "@optionalParam"); 

    SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
    someRequiredParam.Value = rparam; 
    command.Parameters.Add(someRequiredParam); 

    if (oparam.HasValue) 
    { 
     SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
     optionalParam.Value = oparam.Value; 
     command.Parameters.Add(optionalParam); 
    } 
} 
Cuestiones relacionadas