|
|
|
Supreme Being
      
участник
Last Login: 16.04.2008 11:44
Сообщ.: 366,
Visits: 2 473
|
|
Для работы моего приложения необходимо отображать структуру BD(таблицы, поля и их типы) в виде дерева. Я предполагаю, что если считать эту структуру из системных таблиц, и положить в xml файл, то реализовать последующее отображение будет намного проще. Приблизительная структура файла:<?xml version="1.0" encoding="utf-8" ?> <bd> <table name="t1"> <field name="f1" size="6" type="varchar" /> <field name="f2" type="integer" /> <field name="f3" size="6" type="varchar" /> <field name="f4" type="double" /> </table> <table name="t2"> <field name="f1" type="integer" /> <field name="f2" type="integer" /> <field name="f3" size="6" type="varchar" /> <field name="f4" type="double" /> </table> </bd> Очень хотелось бы увидеть пример отображения подобного файла на форме, чтобы каждую таблицу, или поле, можно было пометить/выбрать чекбоксом. OS: windows server 2003 СУРБД: DB2 VS: 2003 fcl 1.1 С уважением,
|
|
|
|
|
Supreme Being
      
участник
Last Login: 16.04.2008 11:44
Сообщ.: 366,
Visits: 2 473
|
|
Код почему то не отображается.
С уважением,
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Код не отображается из-за какого глюка на форуме. Чтобы это побороть надо вручную заменить < на <, а > на >. Насчет отображения структуры БД в виде дерева, то не понятно зачем здесь вводить промежуточный слой в виде xml. Ведь можно читать информацию из системных таблиц и одновременно строить дерево.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 16.04.2008 11:44
Сообщ.: 366,
Visits: 2 473
|
|
Допустим Вы правы. Но тогда каждый раз, когда пользователь будет обращаться к форме, придется заново подключаться к БД, делать селект, и мне кажется, что это будет дольше, чем прочесть и отобразить xml, снабдив его (наверно с помощью стилей xsl) чекбоксами. Структура БД меняется редко. "Пересобирать" xml файл будет нужно ~1 в месяц.
С уважением,
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Мне почему-то показалось, что вопрос по WinForms, а не по ASP.NET и поэтому я дал такой совет. Подключаться каждый раз к базе для получения списка таблиц и полей, конечно, неэффективно, но ведь ASP.NET имеет богатые возможности кеширования. Прочитав список таблиц/колонок можно запомнить их в памяти (в объекте Cache или Application - при условии что таблиц не очень много). Тогда не нужно будет следить за актуальностью xml файла. К тому же для создания файла из самого ASP.NET надо давать права на запись учетной записи веб-сервера, что лично я предпочитаю не делать без крайней необходимости. С другой стороны этот файл можно генерировать из внешней программы по расписанию и тогда прва давать не надо. Для отображения xml файла на странице я вижу два решения: 1) Использование XSLT преобразования. Как его выполнить описано в примере How Do I...Apply an XSL Transformation to XML?. Сам XSL может выглядеть так: <?xml version="1.0" encoding="Windows-1251"?> <xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform version="1.0"><xsl:template match="/"> <html><head> <title>database</title> </head><body> <table border="1"> <xsl:apply-templates select="/bd/table"> <xsl:sort select="@name" order="ascending" /> </xsl:apply-templates> </table> </body> </html> </xsl:template> <xsl:template match="table"> <tr><td> <xsl:element name="input"> <xsl:attribute name="type">checkbox</xsl:attribute> <xsl:attribute name="name"><xsl:value-of select="@name" /></xsl:attribute> <xsl:attribute name="value">1</xsl:attribute> <xsl:attribute name="onclick">alert('table '+this.name)</xsl:attribute> </xsl:element> <xsl:value-of select="@name" /> <div style="padding-left:1em"><xsl:apply-templates /></div> </td></tr> </xsl:template> <xsl:template match="field"> <xsl:element name="input"> <xsl:attribute name="type">checkbox</xsl:attribute> <xsl:attribute name="name"><xsl:value-of select=../@name />.<xsl:value-of select="@name" /></xsl:attribute> <xsl:attribute name="value">1</xsl:attribute> <xsl:attribute name="onclick">alert('field '+this.name)</xsl:attribute> </xsl:element> <xsl:value-of select="@name" /><br /> </xsl:template> </xsl:stylesheet> 2) Читать файл с помощью XmlReader'a. Так как каждый узел имеет четко известное имя мы всегда будем знать что выводить (имя таблицы или имя поля). Этот способ потребует больше ручного кодирования, но возможно окажется более быстрым чем XSLT. Возможно имеет смысл оформить данный элемент в виде user-control'a. Это позволит скрыть мехнизм отображения от родительской страницы.
|
|
|
|