使用基本代码和范围将 SQL 查询/记录集转储到 LO Calc Sheet
Dumping SQL Query/ Recordset in to LO Calc Sheet using basic code and Range
我是 Calc 的新手,我曾经能够在 Excel / VB 中做类似的事情。下面的代码从 MySql 中提取一个 SP,并且完全按照我的要求执行,除了 While 循环。在 VB 中,我能够遍历记录集并将其转储到一个范围内,如下所示,“ActiveWorkbook.Sheets(1).Range("A5").CopyFromRecordset rs” . 无需逐列查看。 Basic-Calc 中有这样的东西吗?我找遍了,什么都没发现。
...
Sub RetriveData()
Dim RowSetObj As Object, ConnectToDatabase As Object
DATABASE_NAME = "file:///home/jod/Documents/test.odb"
DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DBContext.getByName(DATABASE_NAME)
If Not DataSource.IsPasswordRequired Then
ConnectToDatabase = DataSource.GetConnection("","")
Else
InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
ConnectToDatabase = DataSource.ConnectWithCompletion(InteractionHandler)
End If
oURL="file:///home/jod/Documents/CodExm3.ods"
oDoc=StarDesktop.loadComponentFromURL(oURL, "_blank", 0, Array())
oSheet=oDoc.Sheets(0)
oSheet.Name="Tasks"
SQLQuery= "call GVWC_DB.TestSP();"
SQLStatement=ConnectToDatabase.createStatement
RowSetObj=SQLStatement.executeQuery (SQLQuery)
While RowSetObj.Next
i=i+1
oCell=oSheet.getCellByPosition(0,i)
oCell.String=RowSetObj.getString(1)
oCell=oSheet.getCellByPosition(1,i)
oCell.String=RowSetObj.getString(2)
oCell=oSheet.getCellByPosition(2,i)
oCell.String=RowSetObj.getString(3)
oCell=oSheet.getCellByPosition(3,i)
oCell.String=RowSetObj.getString(4)
oCell=oSheet.getCellByPosition(4,i)
oCell.String=RowSetObj.getString(5)
oCell=oSheet.getCellByPosition(5,i)
oCell.String=RowSetObj.getString(6)
oCell=oSheet.getCellByPosition(6,i)
oCell.String=RowSetObj.getString(7)
oCell=oSheet.getCellByPosition(7,i)
oCell.String=RowSetObj.getString(8)
oCell=oSheet.getCellByPosition(8,i)
oCell.String=RowSetObj.getString(9)
oCell=oSheet.getCellByPosition(9,i)
oCell.String=RowSetObj.getString(10)
oCell=oSheet.getCellByPosition(10,i)
oCell.String=RowSetObj.getString(11)
oCell=oSheet.getCellByPosition(11,i)
oCell.String=RowSetObj.getString(12)
oCell=oSheet.getCellByPosition(12,i)
oCell.String=RowSetObj.getString(13)
oCell=oSheet.getCellByPosition(13,i)
oCell.String=RowSetObj.getString(14)
oCell=oSheet.getCellByPosition(14,i)
oCell.String=RowSetObj.getString(15)
oCell=oSheet.getCellByPosition(15,i)
Wend
oSheet.getRows.insertByIndex( 0, 6 )
'Sheet.Columns.removeByIndex(5, 1)
End Sub
...
LibreOffice API 不像 VBA 那样喜欢一次性执行所有操作的庞大命令。相反,它所需要的只是一个简单的 For
循环。
resultSet = SQLStatement.executeQuery(SQLQuery)
While resultSet.next()
For iCol = 1 To resultSet.getMetaData().getColumnCount()
oCell = oSheet.getCellByPosition(iCol - 1, resultSet.getRow())
oCell.String = resultSet.getString(iCol)
Next
Wend
如果您只需要数据的字符串表示形式,那么此方法有效。当对某些列使用 getInt()
等方法时,For
循环可能不是最佳选择。
文档:ResultSet
我是 Calc 的新手,我曾经能够在 Excel / VB 中做类似的事情。下面的代码从 MySql 中提取一个 SP,并且完全按照我的要求执行,除了 While 循环。在 VB 中,我能够遍历记录集并将其转储到一个范围内,如下所示,“ActiveWorkbook.Sheets(1).Range("A5").CopyFromRecordset rs” . 无需逐列查看。 Basic-Calc 中有这样的东西吗?我找遍了,什么都没发现。
...
Sub RetriveData()
Dim RowSetObj As Object, ConnectToDatabase As Object
DATABASE_NAME = "file:///home/jod/Documents/test.odb"
DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource=DBContext.getByName(DATABASE_NAME)
If Not DataSource.IsPasswordRequired Then
ConnectToDatabase = DataSource.GetConnection("","")
Else
InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
ConnectToDatabase = DataSource.ConnectWithCompletion(InteractionHandler)
End If
oURL="file:///home/jod/Documents/CodExm3.ods"
oDoc=StarDesktop.loadComponentFromURL(oURL, "_blank", 0, Array())
oSheet=oDoc.Sheets(0)
oSheet.Name="Tasks"
SQLQuery= "call GVWC_DB.TestSP();"
SQLStatement=ConnectToDatabase.createStatement
RowSetObj=SQLStatement.executeQuery (SQLQuery)
While RowSetObj.Next
i=i+1
oCell=oSheet.getCellByPosition(0,i)
oCell.String=RowSetObj.getString(1)
oCell=oSheet.getCellByPosition(1,i)
oCell.String=RowSetObj.getString(2)
oCell=oSheet.getCellByPosition(2,i)
oCell.String=RowSetObj.getString(3)
oCell=oSheet.getCellByPosition(3,i)
oCell.String=RowSetObj.getString(4)
oCell=oSheet.getCellByPosition(4,i)
oCell.String=RowSetObj.getString(5)
oCell=oSheet.getCellByPosition(5,i)
oCell.String=RowSetObj.getString(6)
oCell=oSheet.getCellByPosition(6,i)
oCell.String=RowSetObj.getString(7)
oCell=oSheet.getCellByPosition(7,i)
oCell.String=RowSetObj.getString(8)
oCell=oSheet.getCellByPosition(8,i)
oCell.String=RowSetObj.getString(9)
oCell=oSheet.getCellByPosition(9,i)
oCell.String=RowSetObj.getString(10)
oCell=oSheet.getCellByPosition(10,i)
oCell.String=RowSetObj.getString(11)
oCell=oSheet.getCellByPosition(11,i)
oCell.String=RowSetObj.getString(12)
oCell=oSheet.getCellByPosition(12,i)
oCell.String=RowSetObj.getString(13)
oCell=oSheet.getCellByPosition(13,i)
oCell.String=RowSetObj.getString(14)
oCell=oSheet.getCellByPosition(14,i)
oCell.String=RowSetObj.getString(15)
oCell=oSheet.getCellByPosition(15,i)
Wend
oSheet.getRows.insertByIndex( 0, 6 )
'Sheet.Columns.removeByIndex(5, 1)
End Sub
...
LibreOffice API 不像 VBA 那样喜欢一次性执行所有操作的庞大命令。相反,它所需要的只是一个简单的 For
循环。
resultSet = SQLStatement.executeQuery(SQLQuery)
While resultSet.next()
For iCol = 1 To resultSet.getMetaData().getColumnCount()
oCell = oSheet.getCellByPosition(iCol - 1, resultSet.getRow())
oCell.String = resultSet.getString(iCol)
Next
Wend
如果您只需要数据的字符串表示形式,那么此方法有效。当对某些列使用 getInt()
等方法时,For
循环可能不是最佳选择。
文档:ResultSet