我有一個工具的需求,它會捕獲數據,然後將其保存在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