powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / The table type parameter must have a valid type name
9 сообщений из 9, страница 1 из 1
The table type parameter must have a valid type name
    #36783810
Yuriy Petrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет,

Получаю указанную в теме ошибку, пытаясь вставить данные в таблицу из DataTable:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
...
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...
...
Рейтинг: 0 / 0
The table type parameter must have a valid type name
    #36783835
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что - вот именно так и написано?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
cmd.CommandText = @"
INSERT INTO <table name> (
   col1,
   col2,
   ...
   colN)

OUTPUT inserted.colХ

SELECT
	col1,
           ...
	colN
FROM
	@tblSource;";
...
Рейтинг: 0 / 0
The table type parameter must have a valid type name
    #36783841
Yuriy Petrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и работает, если вставлять построчно by DataRow, вместо SELECT использовать VALUES...
А хочется одной командой
...
Рейтинг: 0 / 0
The table type parameter must have a valid type name
    #36783931
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yuriy PetrovДа, и работает, если вставлять построчно by DataRow, вместо SELECT использовать VALUES...
А хочется одной командой

и таблица называется <table name>?
и списко колонок с многоточием?
...
Рейтинг: 0 / 0
The table type parameter must have a valid type name
    #36783975
Yuriy Petrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WinnipuhYuriy PetrovДа, и работает, если вставлять построчно by DataRow, вместо SELECT использовать VALUES...
А хочется одной командой

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

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

Нашел вариант через SqlBulkCopy.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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."

Как с этим быть?
...
Рейтинг: 0 / 0
The table type parameter must have a valid type name
    #36784016
Yuriy Petrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yuriy Petrov
Нашел вариант через SqlBulkCopy...

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

Нужен INSERT+OUTPUT...
...
Рейтинг: 0 / 0
The table type parameter must have a valid type name
    #36784306
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если mssql2008 - использовать tvp , завернуть в хранимку
...
Рейтинг: 0 / 0
The table type parameter must have a valid type name
    #36784708
Yuriy Petrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LRесли mssql2008 - использовать tvp , завернуть в хранимку
Да, я уже "работаю" над этой версией. Просто думал, что можно без СП это организовать...
Спасибо.
...
Рейтинг: 0 / 0
The table type parameter must have a valid type name
    #36788182
Yuriy Petrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yuriy PetrovYuriy Petrov
Нашел вариант через SqlBulkCopy...

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

Нужен INSERT+OUTPUT...
Получилось через INSERT+OUTPUT !!!
Оказывается, для подобной SqlCommand нужно обязательно указывать
cmd.Parameters["@tblSource"].TypeName = <имя созданного SQL-типа>:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
...
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();
...
где
Код: plaintext
1.
2.
3.
4.
5.
CREATE TYPE "...имя типа..." AS TABLE (
	col1,
           ...
	colN
);

Для хранимых процедур указывать на клиенте имя типа не обязательно. Ведь сервак по сигнатуре СПшки знает какой тип...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / The table type parameter must have a valid type name
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]