Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 The table type parameter must have a valid type name  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
Всем привет,

Получаю указанную в теме ошибку, пытаясь вставить данные в таблицу из DataTable:
...
SqlCommand cmd = conn.CreateCommand();

cmd.CommandText = @"

INSERT INTO <table name> (

   col1,
   col2,
   ...
   colN)

OUTPUT inserted.colХ

SELECT
	col1,
           ...
	colN
FROM
	@tblSource;";

cmd.Parameters.Add("@tblSource", SqlDbType.Structured).Value = dt;

SqlDataReader drOutput = cmd.ExecuteReader();
...

Что неправильно, или, таковые операции недопустимы?

WBR...
10 авг 10, 12:45    [9239628]     Ответить | Цитировать Сообщить модератору
 Re: The table type parameter must have a valid type name  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
а что - вот именно так и написано?

cmd.CommandText = @"
INSERT INTO <table name> (
   col1,
   col2,
   ...
   colN)

OUTPUT inserted.colХ

SELECT
	col1,
           ...
	colN
FROM
	@tblSource;";
10 авг 10, 12:57    [9239725]     Ответить | Цитировать Сообщить модератору
 Re: The table type parameter must have a valid type name  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
Да, и работает, если вставлять построчно by DataRow, вместо SELECT использовать VALUES...
А хочется одной командой
10 авг 10, 12:59    [9239749]     Ответить | Цитировать Сообщить модератору
 Re: The table type parameter must have a valid type name  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Yuriy Petrov
Да, и работает, если вставлять построчно by DataRow, вместо SELECT использовать VALUES...
А хочется одной командой


и таблица называется <table name>?
и списко колонок с многоточием?
10 авг 10, 13:38    [9240118]     Ответить | Цитировать Сообщить модератору
 Re: The table type parameter must have a valid type name  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
Winnipuh
Yuriy Petrov
Да, и работает, если вставлять построчно by DataRow, вместо SELECT использовать VALUES...
А хочется одной командой


и таблица называется <table name>?
и списко колонок с многоточием?


Не, ну я просто все колонки из моего запроса не перечислял, там просто такой же текст, и текст корректный, т.к., повторюсь, работает... Но построчно.

Нашел вариант через SqlBulkCopy.
using (SqlConnection conn = new SqlConnection(connStr)) {
	try {
		conn.Open();

		using (SqlBulkCopy bc = new SqlBulkCopy(conn)) {

			bc.DestinationTableName = "....";

			try {
				// Write from the source to the destination.
				bc.WriteToServer(dt.CreateDataReader());
			}
			catch (Exception ex) {
				Console.WriteLine("BulkCopy Error: {0}.", ex.Message);
			}
		}
	}
	catch (Exception ex) {
		Console.WriteLine("Connection Open Error: {0}", ex.Message);
	}
}
Работает, но у меня может быть ситуация, когда в DataTable есть лишние колонки, тогда лезет ошибка "The given ColumnMapping does not match up with any column in the source or destination."

Как с этим быть?
10 авг 10, 13:51    [9240228]     Ответить | Цитировать Сообщить модератору
 Re: The table type parameter must have a valid type name  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
Yuriy Petrov

Нашел вариант через SqlBulkCopy...

Есть большой недостаток, как для моей задачи, - не могу получить сгенеренные IDENTITY-айдишники.

Нужен INSERT+OUTPUT...
10 авг 10, 14:02    [9240330]     Ответить | Цитировать Сообщить модератору
 Re: The table type parameter must have a valid type name  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
если mssql2008 - использовать tvp, завернуть в хранимку
10 авг 10, 15:43    [9241402]     Ответить | Цитировать Сообщить модератору
 Re: The table type parameter must have a valid type name  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
LR
если mssql2008 - использовать tvp, завернуть в хранимку

Да, я уже "работаю" над этой версией. Просто думал, что можно без СП это организовать...
Спасибо.
10 авг 10, 18:27    [9242874]     Ответить | Цитировать Сообщить модератору
 Re: The table type parameter must have a valid type name  [new]
Yuriy Petrov
Member

Откуда:
Сообщений: 91
Yuriy Petrov
Yuriy Petrov

Нашел вариант через SqlBulkCopy...

Есть большой недостаток, как для моей задачи, - не могу получить сгенеренные IDENTITY-айдишники.

Нужен INSERT+OUTPUT...

Получилось через INSERT+OUTPUT !!!
Оказывается, для подобной SqlCommand нужно обязательно указывать
cmd.Parameters["@tblSource"].TypeName = <имя созданного SQL-типа>:
...
SqlCommand cmd = conn.CreateCommand();

cmd.CommandText = @"

INSERT INTO <table name> (

   col1,
   col2,
   ...
   colN)

OUTPUT inserted.colХ

SELECT
	col1,
           ...
	colN
FROM
	@tblSource;";

cmd.Parameters.Add("@tblSource", SqlDbType.Structured).Value = dt;
cmd.Parameters["@tblSource"].TypeName = "...имя типа...";      //  MANDATORY HERE

SqlDataReader drOutput = cmd.ExecuteReader();
...
где
CREATE TYPE "...имя типа..." AS TABLE (
	col1,
           ...
	colN
);

Для хранимых процедур указывать на клиенте имя типа не обязательно. Ведь сервак по сигнатуре СПшки знает какой тип...
12 авг 10, 13:14    [9252970]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить