我有一个工具的需求,它会捕获数据,然后将其保存在excel文件中并为数据库执行生成sql。为了解决这个问题,我开始设计和开发一个框架,该框架可以读取xml文件并渲染摆动屏幕以进行数据捕获并将其保存在excel中。现在,我已经到了一个我有excel数据的阶段。现在,我无法进一步确定方法。我有一种方法来从Excel表格中获取数据并构建sql,但我对这种方法没有信心。工具的设计体系结构
该方法正在考虑的是开发更多的xml(每个db中的Schema一个),它将包含所需数据库表结构的副本。在GUI xml中,我将提供一个名为“databaseMapping”的新标签,其中包含SCHEMA_NAME; TABLE_NAME; COLUMN_NAME。当用户询问为特定文件生成sql时,我会读取与该excel相关的屏幕xml,并找出数据库映射,然后生成sql的。但我看到这种方法面临的挑战: -
1)在excel中,列对应于多个表,并且可能有分散在不同工作表中的列,因此读取和构建sql将是一种耗费资源的活动。
2)读取excel本身非常慢(使用POI),所以随着excel的增长,应用程序的性能会下降。我相信POI不支持应对来自不同工作表的整个专栏并构建新的工作簿或工作表?如果可以做到,那么它仍然是可以管理的。读取每一行,然后每个单元格在db表结构中构建新的临时工作表以生成sql,对我来说看起来并不完全正确。
GUI XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DataDetails>
<Page pageId="1">
<Column columnName="Branch ID">
<dataType>String</dataType>
<maxLength>3</maxLength>
<isMandatory>true</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Branch Name">
<dataType>String</dataType>
<maxLength>10</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Branch Type">
<dataType>String</dataType>
<maxLength>15</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Location">
<dataType>String</dataType>
<maxLength>3</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Pincode">
<dataType>String</dataType>
<maxLength>3</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
</Page>
<Page pageId="2">
<Column columnName="Business Line">
<dataType>String</dataType>
<maxLength>3</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Branch Currency">
<dataType>Date</dataType>
<maxLength></maxLength>
<isMandatory>false</isMandatory>
<isUnique></isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices></limitedChoices>
<databaseMapping></databaseMapping>
</Column>
<Column columnName="Action">
<dataType>String</dataType>
<maxLength>10</maxLength>
<isMandatory>false</isMandatory>
<isUnique>true</isUnique>
<defaultValue></defaultValue>
<forbiddenCharacters></forbiddenCharacters>
<limitedChoices>ComboBoxTest_Single.xlsx - ACTION;ACTION </limitedChoices>
<headerName>CODE_SUB_ID</headerName>
<databaseMapping></databaseMapping>
</Column>
</Page>
</DataDetails>
DB XML(建议)
<?xml version="1.0" encoding="UTF-8"?>
<table name="tablename">
<column name="column1">
<dataType>varchar</dataType>
<length>20</length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
<isPrimaryKey>Y</isPrimaryKey>
</column>
<column name="column2">
<dataType>timestamp</dataType>
<length></length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column3">
<dataType>varchar</dataType>
<length>20</length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column4">
<dataType>decimal</dataType>
<lengthIntegerPart>24</lengthIntegerPart>
<lengthFractionalPart>6</lengthFractionalPart>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column5">
<dataType>integer</dataType>
<length>1</length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column6">
<dataType>varchar2</dataType>
<length>30</length>
<nullAllowed>N</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column7">
<dataType>date</dataType>
<length></length>
<nullAllowed>Y</nullAllowed>
<defaultValue></defaultValue>
</column>
<column name="column8">
<dataType>decimal</dataType>
<lengthIntegerPart>24</lengthIntegerPart>
<lengthFractionalPart>6</lengthFractionalPart>
<nullAllowed>N</nullAllowed>
<defaultValue></defaultValue>
</column>
</table>
谢谢!
为什么你需要Excel作为中间步骤?你可以直接从数据录入应用程序到数据库吗?有很多ORM使得你想要做的映射变得容易,所以你不必编写一些SQL生成工具。 – Ocelot20
@ Ocelot20 - 这个工具将被高层管理人员用来使用,他们会一直在移动,在他们的机器上没有数据库,将会落后于更严格的高层政策。因此,我们需要将数据保存在excel中,然后每当他们回来或他们希望将数据与公司员工共享时,他们将发送excel并将其上载到公司服务器中。 – dareurdream
数据输入工具是否也可用于显示数据并从您自己的专有格式中读取数据? – Ocelot20