Here's kind of an off the wall idea...
A couple of years back I needed to insert literally millions of rows into a SQL Server database table from a datawindow, unfortunately the database was located in a different state and accessed via a WAN which had decent bandwidth but a horrible turn around latency. I created a stored procedure on the database which accepted 2000 arguments, each argument being a string which would contain an entire record. The stored procedure was then responsible for expanding out each record into its constituent fields and inserting the rows. Needless to say, the PowerBuilder end had to read the datawindow and assemble the record strings, and admittedly this was a fair amount of work.
The above said, the two hours of programming I invested was chump change compared to the net gain in performance; the elapse time for the native DW to SQL Server insert was shortened from an estimated week (running 24/7) to about three hours.