Отображение структуры BD в виде xml файла на web-форме
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Отображение структуры BD в виде xml файла на... Expand / Collapse
Автор
Сообщение
23.01.2007 13:14
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme 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

С уважением,

Сообщ. #909961
23.01.2007 13:32
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Код почему то не отображается.

С уважением,
Сообщ. #909962
23.01.2007 13:59
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Код не отображается из-за какого глюка на форуме. Чтобы это побороть надо вручную заменить < на &lt;, а > на &gt;.

Насчет отображения структуры БД в виде дерева, то не понятно зачем здесь вводить промежуточный слой в виде xml. Ведь можно читать информацию из системных таблиц и одновременно строить дерево.

Сообщ. #909964
23.01.2007 14:23
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Допустим Вы правы. Но тогда каждый раз, когда пользователь будет обращаться к форме, придется заново подключаться к БД, делать селект, и мне кажется, что это будет дольше, чем прочесть и отобразить xml, снабдив его (наверно с помощью стилей xsl) чекбоксами. Структура БД меняется редко. "Пересобирать" xml файл будет нужно ~1 в месяц.

С уважением,
Сообщ. #909965
25.01.2007 9:49
Supreme Being

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. Это позволит скрыть мехнизм отображения от родительской страницы.

Сообщ. #910040
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl, Alexey Spirin

Время GMT +3:00, Сейчас 11:20