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.
Ответы
Ответ 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);
}
}