Как выполнить Таблицу SP в C #

2

Я посмотрел на сайт SQLTeam, но теперь у меня возникла новая проблема: у меня есть столбец IDENTITY, и их пример не работает.

У меня есть SQL Server 2008 и VS 2008. Я пытаюсь выполнить InsertPIF SP с помощью С# и таблицы UDT, но получаю исключение. Я просмотрел веб-сайт SQLTeam пример с таблицей UDT, но в их примере нет столбца идентификации, подобного моему.

Однако в их примерной таблице нет столбца идентификации, подобного моему. То, что я пытаюсь сделать, должно быть простым. Я пробовал много разных вариантов этого, но по существу:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
INSERT dbo.ParentTable SELECT strRow FROM @InputFileParam
GO

где

CREATE TABLE [dbo].[ParentTable](
    [ParentID] [int] IDENTITY(1,1) NOT NULL,
    [strInput] [varchar](8000) NULL,
PRIMARY KEY NONCLUSTERED 
(...)

и введите:

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

То, что я пытаюсь сделать, это выполнить указанный выше SP для вставки новых записей в ParentTable. Пример:

INSERT INTO ParentTable(strInput) VALUES ('A3|BB|C|DDD')
INSERT INTO ParentTable(strInput) VALUES ('A4|GOB|BLDY|GOOK')
INSERT INTO ParentTable(strInput) VALUES ('A5|Hello|My|Darling')

Вот мой код С# перед секцией AppendData:

DataTable dt = new DataTable();
String[] header = myStringArray[0].Split('|');

DataRow dr = dt.NewRow();
DataColumn dc = new DataColumn();
dc.DataType = typeof(Int32);
dc.ColumnName = "NumCols";
dc.AutoIncrement=true;
dt.Columns.Add(dc);

DataColumn dc2 = new DataColumn();
dc2.DataType = typeof(string);
dc2.ColumnName = "strRow";
dt.Columns.Add(dc2);
dr["NumCols"] = 1;
dr["strRow"] = "AA|BBB|CC|DD|E";
dt.Rows.Add(dr);

...
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = "dbo.InsertPIF";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn;
                SqlParameter param = cmd.Parameters.AddWithValue("@InputFileParam", SqlDbType.Structured);

        param.Value = dt;
        conn.Open();
        RowsAffected = cmd.ExecuteNonQuery();

Я устанавливаю идентификатор для ParentTable, но мне кажется, что я должен выполнить этот каждый сеанс, поэтому я не уверен, как удалить требование идентификации, а также сделать идентификатор включенным. Исключение:

INSERT в столбец идентификатора, который не разрешен для переменных таблицы. Данные для табличного параметра '@InputFileParam' не соответствуют типу таблицы параметра.

Как выполнить этот SP?

Теги:
user-defined-types

3 ответа

1
Лучший ответ

Я думаю, что Roland на правильном пути - столбы IDENTITY определенно являются проблемой. Поскольку у вашей конечной целевой таблицы уже есть столбец IDENTITY, который будет автоматически заполнен для вас, я бы рекомендовал не указывать один и тот же столбец в вашем пользовательском типе таблицы (а также не объявлять первичный ключ в типе таблицы):

CREATE TYPE [dbo].[parseInputFile] AS TABLE
    ([strRow] [varchar](500) NOT NULL)

Затем в коде С# просто настройте DataTable с помощью одного столбца:

DataTable dt = new DataTable();

DataColumn dc = new DataColumn();
dc.DataType = typeof(string);
dc.ColumnName = "strRow";
dt.Columns.Add(dc);

а затем добавьте свои столбцы в DataTable "dt" - только с одной строкой strRow.

В вашем сохраненном proc, который затем вызывается с вашим пользовательским типом таблицы, просто вставьте свои строки:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
  INSERT INTO dbo.ParentTable(strInput)
    SELECT strRow FROM @InputFileParam
GO

Это должно сделать это, я надеюсь! (не успел проверить это сам)

Марк

  • 0
    Большое спасибо всем вам! Марк, я попробовал ваше последнее решение, и это исправило его для меня! Я очень счастлив сейчас! (Я работал над этой проблемой в течение 3 дней).
1

Хорошо, я еще не работал с TVP, поэтому я мог ошибаться - но из моего чтения и общего фона SS я думаю, что ваша проблема такова:

В вашей постоянной таблице есть столбец Identity, поэтому SS хочет обработать это для вас. Вы можете установить Identity Insert, но это не очень хорошая идея.

Попробуйте указать столбец для вставки в ваш SP:

ALTER PROCEDURE [dbo].[InsertPIF] @InputFileParam parseInputFile READONLY
AS
INSERT dbo.ParentTable (strInput) SELECT strRow FROM @InputFileParam
GO

Другое, на что можно обратить внимание, как предложил Тим Лентин (пока я писал этот ответ), действительно ли вы на самом деле попадаете на сервер. Поскольку вы определили столбец NumCols в DataTable как AutoIncrement, возможно, вы получаете свое исключение в коде С#, используя:

...
dr["NumCols"] = 1;
...

<edit>

Не знаю, что я ткнул, когда я нажал кнопку Отправить...

Если это так, попробуйте оставить AutoIncrement, когда вы создаете свой DataTable. Если типы данных столбцов являются согласованными, это свойство не имеет значения, если выстраивать TVP как "то же самое", что и тип SS.

</Редактирование >

0

Может ли ошибка исходить из таблицы parseInputFile? NumCols определяется как поле идентификации, но в коде С# вы устанавливаете значение записи в 1.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню