Дотнет писали упоротые психи
Jan. 2nd, 2010 12:53 pmreader = cmd.ExecuteReader(CommandBehavior.SchemaOnly);
и
reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo);
Схема результата, как это не смешно, отличается не только наличием значения(true,false) в поле "IsKey" а еще и тем, что во втором случае добавляются поля первичных ключей всех связанных в запросе по join таблиц и заодно зачем-то rowversion поля. Отличить, какое поле от какой таблицы-алиаса в запросе, очевидно, никак.
Придется делать видимо два запроса для схемы - по первому получать список полей, а по второму - список ключей, а потом их результаты объединять.
В общем, ADO.NET выглядит так, как будет хотели сделать как можно больше работы вместо того, кто будет использовать это дело, но при этом получилось, что использование ограничено теми вариантами, которые пришли им в голову, а сделать по другому - начинаются пляски с бубнами.
Такие вещи, имхо, лучше раскладывать на два слоя - простой низкоуровневый, с минимумом интеллекта и с торчащим наружу всем мыслимым API, и высокоуровневый с интеллектом, шлюхами и блекджеком. А то как-то из-за второго вытаскивать первый через дырки в абстракциях это какое-то совсем уж унылое занятие.
и
reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo);
Схема результата, как это не смешно, отличается не только наличием значения(true,false) в поле "IsKey" а еще и тем, что во втором случае добавляются поля первичных ключей всех связанных в запросе по join таблиц и заодно зачем-то rowversion поля. Отличить, какое поле от какой таблицы-алиаса в запросе, очевидно, никак.
Придется делать видимо два запроса для схемы - по первому получать список полей, а по второму - список ключей, а потом их результаты объединять.
В общем, ADO.NET выглядит так, как будет хотели сделать как можно больше работы вместо того, кто будет использовать это дело, но при этом получилось, что использование ограничено теми вариантами, которые пришли им в голову, а сделать по другому - начинаются пляски с бубнами.
Такие вещи, имхо, лучше раскладывать на два слоя - простой низкоуровневый, с минимумом интеллекта и с торчащим наружу всем мыслимым API, и высокоуровневый с интеллектом, шлюхами и блекджеком. А то как-то из-за второго вытаскивать первый через дырки в абстракциях это какое-то совсем уж унылое занятие.