Создать схему DataTable из SQL

Я хочу использовать адаптер данных с таблицей данных для вставки тысяч записей в таблицу sql с 30 столбцами.

SqlDataAdapter adapter = new SqlDataAdapter();
DataTable table = new DataTable();
adapter.InsertCommand = new SqlCommand("INSERT INTO ...");
adapter.UpdateBatchSize = 1000;
DataRow r = null;
foreach(var entry in list) 
{
    r = table.NewRow();
    r["lastchange"] = entry.TryGet("LastChangeTime"); 
    // <- throws System.ArgumentException: Column does not belong to table
    ...
}

Есть ли способ не вручную определять схему данных, а читать ее из таблицы, в которой должны выполняться вставки?


person Alexander    schedule 04.07.2017    source источник
comment
Возможно, это дубликат оператора SQL для получения типа столбца   -  person Marek Vitek    schedule 04.07.2017


Ответы (2)


Определите SelectCommand и примените метод Fill, чтобы сначала получить данные. Если вам нужна только схема таблицы, просто сделайте запрос, который не возвращает строк.

SqlDataAdapter adapter = new SqlDataAdapter();
DataTable table = new DataTable();
adapter.SelectCommand = new SqlCommand("SELECT * FROM myTable WHERE 1=2");
adapter.Fill(table);
person Serg    schedule 04.07.2017
comment
НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО. Я видел это в реальном мире, и это была ужасная катастрофа производительности. - person Marek Vitek; 04.07.2017
comment
@MarekVitek, при любых обстоятельствах все может привести к катастрофе. Можно поконкретнее, какая линия опасна? - person Serg; 04.07.2017
comment
Опасно получать структуру данных, выполняя запрос к БД. Вы можете подумать, что ваш запрос прост, затем придет кто-то, кто подумает, почему бы не оставить его позади представления, и вдруг вы обнаружите, что выполняете запрос к представлению, содержащему несколько объединений и несколько условий, поэтому даже простой запрос в конечном итоге будет выполнять много работы. - person Marek Vitek; 04.07.2017
comment
Есть лучшие способы получить структуру базы данных. Поскольку мы не говорим о конкретном механизме БД, вот несколько примеров MS SQL и Oracle и PostrgreSQL и MySQL Я считаю, что ваш трюк отлично работает в большинстве время. Но однажды это сожжет тебя. - person Marek Vitek; 04.07.2017
comment
@MarekVitek, да, запуск этого против сложного представления может быть дорогостоящим, но, конечно, это не случай OP, поскольку он говорит, что вставляет в .. таблицу sql, а SqlDataAdapter подразумевает, что это MS sql-сервер. - person Serg; 04.07.2017
comment
@MarekVitek, не могли бы вы указать лучшее решение, пожалуйста. - person dellos; 03.11.2020
comment
@dellos, я не программист на С#. Но вы можете посмотреть FillSchema . Я считаю, что это то, что вы ищете. - person Marek Vitek; 03.11.2020
comment
@MarekVitek, метод FillSchema извлекает схему из источника данных с помощью команды SelectCommand. - person Serg; 04.11.2020
comment
@Serg Может быть идоматичнее использовать FillSchema(). Я согласен, что ваш метод отлично работает в большинстве случаев. Если это не так, либо вы делаете что-то странное (например, нацеливание на представление), либо РСУБД делает что-то странное, либо конкуренция за БД настолько высока, что вам все равно следует определить таблицу в логике приложения. В документе сказано, что FillSchema() использует FOR BROWSE. Это имеет свои особенности и предполагает использование sp_describe_first_result_set или sys.dm_exec_describe_first_result_set. Одним из преимуществ FillSchema() является то, что можно использовать один и тот же запрос для получения данных и схемы. - person Bacon Bits; 13.11.2020

Вы можете создать/определить набор данных в своем проекте и использовать его в своей последующей работе, где вам нужно.

Посмотрите ссылку ниже, показывающую, как добавить набор данных в ваш проект и добавить в него таблицы, а также как использовать адаптеры данных с этим набором данных.

https://msdn.microsoft.com/en-us/library/04y282hb.aspx

https://msdn.microsoft.com/en-us/library/ms171919.aspx

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/populating-a-dataset-from-a-dataadapter

Я надеюсь, что это поможет вам. :)

person Hitesh    schedule 04.07.2017