Таблица sql udt, vs 2008, csharp

Я пытаюсь запустить хранимую процедуру SQL из Visual Studio 2008, которая принимает табличный параметр UDT в качестве входных данных. Я добавил этот параметр в Visual Studio 2008, но когда я запускаю эту программу, она получает «ArgumentException — указанный тип не зарегистрирован на целевом сервере». Поэтому я погуглил эту проблему и подумал, что мне нужно создать новый класс в Visual Studio 2008, соответствующий свойствам этого типа таблицы из SQL Server 2008. Но я не могу найти в Интернете никаких примеров с использованием table УДТ. И я перепробовал все примеры скалярных UDT, но не знал, как изменить их, чтобы сделать их основанными на таблицах.
Я также читал, что мне может понадобиться создать сборку, хотя я не знаю, так ли это требуется только для импорта типа в SQL Server 2008 или если его также можно использовать для импорта типа в Visual Studio. Кстати, я не вижу никаких типов, перечисленных в обозревателе серверов в VS 2008, хотя я вижу базу данных и ее SP. Я попытался обновить базу данных, но типы все еще не отображались. То, что мне нужно сделать, просто. У меня есть таблица UDT, например:

CREATE TYPE [dbo].[parseInputFile] AS TABLE(
[NumCols] [int] IDENTITY(1,1) NOT NULL,
[strRow] [varchar](500) NOT NULL,
PRIMARY KEY CLUSTERED 

И фрагмент кода из моего кода С#:

    public static int AppendData(string[] myStringArray)
    {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "dbo.uspAppendTableFromInput";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn;
            SqlParameter param = cmd.Parameters.Add("@InputFileParam", SqlDbType.Udt);
            param.UdtTypeName = "AdventureWorks.dbo.parseInputFile";
            param.Value = myStringArray;
            conn.Open();
            RowsAffected = cmd.ExecuteNonQuery();

RowsAffected показывает ноль затронутых строк после запуска. Что мне не хватает? Можете ли вы указать мне веб-сайт, демонстрирующий простой пример этого. Или еще подскажите? Я также пробовал 'param.UdtTypeName="parseInputFile";' для приведенного выше фрагмента, но это вернуло ту же ошибку. Кстати, «myStringArray» — это, по сути, таблица. Это ряд строк. например myStringArray[0] = "Привет|Боб|Как делаешь", myStringArray[1] = "Я|Все в порядке|И" и т. д.


person salvationishere    schedule 15.06.2009    source источник
comment
пример @ stackoverflow.com/questions/337704 /   -  person ahains    schedule 16.06.2009
comment
Как выглядит ваш сохраненный процесс? В основном список параметров, которые вы объявили   -  person marc_s    schedule 16.06.2009
comment
И чего именно вы пытаетесь добиться? Вызов хранимой процедуры с набором параметров в пользовательском типе таблицы? Или вызвать хранимую процедуру, чтобы получить из нее такую ​​таблицу ВОЗВРАТ?? Не совсем понятно...   -  person marc_s    schedule 16.06.2009


Ответы (1)


В принципе, вы почти правильно настроили - на полпути :-)

Прочтите вводные статьи о TVP — табличных параметрах, которые, как я ДОГАДАЮ, вы пытаетесь использовать, верно?

В основном, что вам нужно сделать, это:

  • создать пользовательский тип таблицы - он у вас уже есть
  • создайте хранимую процедуру, которая принимает эти типы таблиц в качестве входного параметра READONLY (не уверен, что вы это получили - еще не видели ваш код)
  • звонить из .NET; вам нужно создать экземпляр DataTable и воссоздать ту же структуру (с точки зрения полей и их типов — показано в статье SQL Team)
  • заполнить эту таблицу данных
  • создайте SqlConnection и SqlCommand (CommandType = Stored Proc) в .NET, который определяет параметры табличного типа как тип "SqlDbType.Structured" в .NET и устанавливает его значения в DataTable, созданный выше
  • вызовите этот сохраненный процесс (упакованный в SqlCommand) из .NET

Это вообще помогает? Я настоятельно рекомендую статью SQL Team - очень информативно!

Марк

person marc_s    schedule 15.06.2009
comment
Спасибо за советы, Марк! Я только что опубликовал еще один вопрос, касающийся этой же проблемы. У меня были некоторые проблемы с этим сайтом, поэтому я опубликовал его как другой вопрос. Не могли бы вы взглянуть на этот другой вопрос? Должно быть легко найти, так как я разместил только два вопроса на этом сайте. Спасибо. - person salvationishere; 16.06.2009