25
    [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

错误

消息 6522,级别 16,状态 1,过程 MyMethod,第 0 行在执行用户定义的例程或聚合“MyMethod”期间发生 .NET Framework 错误:System.ArgumentException:dbType NVarChar 对于此构造函数无效。System.ArgumentException:在 Microsoft.SqlServer.Server.SqlMetaData..ctor 的 Microsoft.SqlServer.Server.SqlMetaData.Construct(字符串名称,SqlDbType dbType,布尔 useServerDefault,Boolean isUniqueKey,SortOrder columnSortOrder,Int32 sortOrdinal)在 Microsoft.SqlServer.Server.SqlMetaData..ctor(字符串名称,SqlDbType dbType ) 在 WcfClrApps.MyNamespace.MyMethod()

如何返回我自己创建的记录?我不想运行任何 SQL。项目构建设置为 .NET 3.5。MSDN 指出 SQL 2008 R2 不支持 4.0。

4

2 回答 2

44

问题有两个方面。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

        }
    }

迭代示例

于 2012-06-18T23:45:33.753 回答
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);
        }
    }
于 2012-06-18T21:35:03.940 回答