SQL таблица UDT, против 2008, Csharp - PullRequest
1 голос
/ 16 июня 2009

Я пытаюсь запустить хранимый процесс SQL из Visual Studio 2008, который принимает табличный параметр UDT в качестве входных данных. Я добавил этот параметр в Visual Studio 2008, но при запуске этой программы появляется «ArgumentException - указанный тип не зарегистрирован на целевом сервере». Поэтому я решил эту проблему и решил, что мне нужно создать новый класс в Visual Studio 2008, соответствующий свойствам этого типа таблицы из SQL Server 2008. Но я не могу найти в Интернете никаких примеров, связанных с table UDT , И я перепробовал все примеры скалярных 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 

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

    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();

RowsActed показать ноль строк, затронутых после выполнения этого. Что мне не хватает? Можете ли вы указать мне на сайт, демонстрирующий простой пример этого. Или еще дать мне совет? Я также попытался 'param.UdtTypeName = "parseInputFile";' для приведенного выше фрагмента, но это вернуло ту же ошибку. Кстати, «myStringArray» по сути является таблицей. Это серия строк. например myStringArray [0] = "Hello | Bob | How | Do", myStringArray [1] = "I | Am | Fine | And" и т. д.

1 Ответ

2 голосов
/ 16 июня 2009

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

Посмотрите эти вводные статьи для TVP - табличные параметры - это то, что я УГАДАЮ вы пытаетесь использовать, верно?

В основном вам нужно сделать следующее:

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

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

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...