2012-06-18 6 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); 
     } 
    } 

Wenn ich die Methode in SQL laufenDie dbType NVarChar ist ungültig für diesen Konstruktor

EXEC MyMethod

Fehler

Msg 6522, Ebene 16, Status 1, Prozedur MyMethod, Linie 0 Ein .NET Framework Fehler trat während der Ausführung von benutzerdefinierten Routine oder Aggregat "MyMethod": System.ArgumentException: Der dbType NVarChar ist für diesen Konstruktor ungültig. System.ArgumentException: bei Microsoft.SqlServer.Server.SqlMetaData.Construct (String name, SqlDbType dbType, Boolean useServerDefault, Boolean IsUniqueKey, SortOrder columnSortOrder, Int32 sortOrdinal) bei Microsoft.SqlServer.Server.SqlMetaData..ctor (String Name, SqlDbType dbType) bei WcfClrApps.MyNamespace.MyMethod()

Wie kann eine Rückkehr eine Platte, die ich selbst erstellen? Ich möchte kein SQL ausführen. Der Projektaufbau ist für .NET 3.5 festgelegt. MSDN gibt an, dass 4.0 in SQL 2008 R2 nicht unterstützt wird.

+0

Ist das Problem der Typ Wahl, oder ist das Problem, dass Sie keine Länge angegeben haben? –

Antwort

27

Das Problem ist zweifach. 1. Maximale Länge ist erforderlich. 2. SendResultsStart()/SendResultsEnd() sind erforderlich.

[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

Für den spezifischen Fehler 'The dbType NVarChar ist ungültig für diesen Konstruktor' löst nur das Hinzufügen des MaxLength-Parameters das Problem. Es stellt sich heraus, dass Sie bei der Verwendung von SqlDbType.NVarChar den Konstruktor verwenden müssen, der den MaxLength-Parameter akzeptiert. – BornToCode

3

Nie so etwas getan, aber würde das nicht funktionieren?

[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

Der einzige Unterschied, den ich sehe, ist NVarchar zu varchar. Das ist, womit ich ursprünglich angefangen habe und das Ergebnis ist ähnlich. –

+0

änderte auch den Spaltennamen, da ich glaube, dass würde Fehler, haben Sie mehr Code für mich, Unit-Tests mit zu laufen? – Neo

Verwandte Themen