DbType NVarChar недопустим для этого конструктора - программирование
Подтвердить что ты не робот

DbType NVarChar недопустим для этого конструктора

    [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, уровень 16, состояние 1, процедура MyMethod, строка 0 A.NET Ошибка Framework возникла во время выполнения пользовательской процедуры или совокупность "MyMethod": System.ArgumentException: dbType NVarChar для этого конструктора недействителен. Исправление System.ArgumentException: at Microsoft.SqlServer.Server.SqlMetaData.Construct(имя строки, SqlDbType dbType, Boolean useServerDefault, Boolean isUniqueKey, SortOrder columnSortOrder, Int32 sortOrdinal) при Microsoft.SqlServer.Server.SqlMetaData..ctor(имя строки, SqlDbType dbType) в WcfClrApps.MyNamespace.MyMethod()

Как можно вернуть запись, которую я создаю? Я не хочу запускать SQL. Для .NET 3.5 устанавливается сборка проекта. MSDN указывает, что 4.0 не поддерживается в SQL 2008 R2.

4b9b3361

Ответ 1

Проблема состоит из двух раз. 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

        }
    }

Итерационный пример

Ответ 2

Никогда не делал ничего таким образом, но не будет ли это работать?

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