2012-06-18 46 views
16
[Microsoft.SqlServer.Server.SqlProcedure] 
    public static void MyMethod() 
    { 
     string connectionString = "context connection=true"; 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      SqlMetaData[] metaData = { 
             new SqlMetaData("Column1", System.Data.SqlDbType.NVarChar) 
             ,new SqlMetaData("Column1", System.Data.SqlDbType.NVarChar) 
            }; 
      SqlDataRecord record = new SqlDataRecord(metaData); 
      record.SetString(0,"hello world"); 
      SqlContext.Pipe.SendResultsRow(record); 
     } 
    } 

Cuando ejecuto el método en SQLEl tipo_bd Nvarchar no es válido para este constructor

EXEC MyMethod

error

Msg 6522, nivel 16, estado 1, procedimiento MiMetodo, Línea 0 A .NET Se ha producido un error de Framework durante la ejecución de la rutina definida por el usuario aggregate "MyMethod": System.ArgumentException: dbType NVarChar no es válido para este constructor. System.ArgumentException: en Microsoft.SqlServer.Server.SqlMetaData.Construct (String nombre, SqlDbType tipo_bd, Boolean useServerDefault, Boolean isUniqueKey, SortOrder columnSortOrder, Int32 sortOrdinal) en Microsoft.SqlServer.Server.SqlMetaData..ctor (String nombre, SqlDbType tipo_bd) en WcfClrApps.MyNamespace.MyMethod()

¿Cómo puede un retorno de un disco que yo creo a mí mismo? No quiero ejecutar ningún SQL. La compilación del proyecto está configurada para .NET 3.5. MSDN indica que 4.0 no es compatible con SQL 2008 R2.

+0

¿El problema es la elección de tipo, o es el problema de que no se ha especificado una longitud? –

Respuesta

27

El problema es dos veces. 1. Se requiere una longitud máxima. 2. SendResultsStart()/SendResultsEnd() son obligatorios.

[Microsoft.SqlServer.Server.SqlProcedure] 
    public static void MyMethod() 
    { 
     string connectionString = "context connection=true"; 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      SqlMetaData[] metaData = { 
             new SqlMetaData("Column1", System.Data.SqlDbType.NVarChar, 100)//Max length has to be specified 
             ,new SqlMetaData("Column1", System.Data.SqlDbType.NVarChar, 100)//same story 
            }; 
      SqlDataRecord record = new SqlDataRecord(metaData); 
      SqlContext.Pipe.SendResultsStart(record);//SendResultsStart must be called 

      //create a row and send it down the pipe 
      record.SetString(0,"hello world"); 
      SqlContext.Pipe.SendResultsRow(record); 

      SqlContext.Pipe.SendResultsEnd();//End it out 

     } 
    } 

Iterative example

+2

Para el error específico 'The dbType NVarChar no es válido para este constructor' solo al agregar el parámetro MaxLength se resuelve el problema. Resulta que al usar SqlDbType.NVarChar, debe usar el constructor que acepta el parámetro MaxLength. – BornToCode

3

Nunca hice nada de esta manera, pero ¿no funcionaría?

[Microsoft.SqlServer.Server.SqlProcedure] 
    public static void MyMethod() 
    { 
     string connectionString = "context connection=true"; 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      SqlMetaData[] metaData = { 
             new SqlMetaData("Column1", System.Data.SqlDbType.VarChar) 
             ,new SqlMetaData("Column2", System.Data.SqlDbType.VarChar) 
            }; 
      SqlDataRecord record = new SqlDataRecord(metaData); 
      record.SetString(0,"hello world"); 
      SqlContext.Pipe.SendResultsRow(record); 
     } 
    } 
+0

La única diferencia que veo es NVarchar a varchar. Eso es con lo que originalmente comencé y el resultado es similar. –

+0

también cambió el nombre de la columna ya que creo que sería un error, ¿tiene más código para que pueda ejecutar las pruebas unitarias? – Neo

Cuestiones relacionadas