dbType NVarChar对此构造函数无效

时间:2012-06-18 21:08:11

标签: c# sql-server-2008 sqlclr

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

当我在SQL中运行该方法时

EXEC MyMethod

错误

  

Msg 6522,Level 16,State 1,Procedure MyMethod,Line 0 A .NET   在执行用户定义的例程或执行期间发生框架错误   aggregate“MyMethod”:System.ArgumentException:dbType NVarChar   对于此构造函数无效。 System.ArgumentException:at   Microsoft.SqlServer.Server.SqlMetaData.Construct(String name,   SqlDbType dbType,Boolean useServerDefault,Boolean isUniqueKey,   SortOrder columnSortOrder,Int32 sortOrdinal)at   Microsoft.SqlServer.Server.SqlMetaData..ctor(String name,SqlDbType   dbType)在WcfClrApps.MyNamespace.MyMethod()

如何归还我自己制作的唱片?我不想运行任何SQL。项目构建是为.NET 3.5设置的。 MSDN表示SQL 2008 R2中不支持4.0。

2 个答案:

答案 0 :(得分:36)

这个问题有两个问题。 1.最大长度是必需的。 2. SendResultsStart() / SendResultsEnd()是必需的。

    [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

答案 1 :(得分:3)

从未以这种方式做过任何事情,但这不会起作用吗?

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