Hi Mervyn,
Brilliant, it took only 10.62 seconds to load the 25k records!
Thanks for that sample code!
Cheers,
Gaetano.
Mervyn Bick Wrote:
> On 2020-07-28 14:00, Mervyn Bick wrote:
>
> > Firebird does not accept multiple rows in a single INSERT but I've
> > modified my loading program so that Gaetano can try it. This program
> > has NOT been tested as I don't have MySql available.
>
> There was a typo which has been fixed. I've also added code to create
> the table if it doesn't exist. If the table exists the
> try...catch...endtry will prevent an error. The revised version is
> attached.
>
>
> > The program takes less than a second to generate the 8 INSERT statements
> > requires to deal with the 7577 records. Executing them should not take
> > too many seconds. :-)
>
> The program took 4.90 seconds to create the table and then load the 7576
> test records I have.
>
> I have created an ODBC connection named energydata which has the
> username and password hard-coded which accounts for the brief connection
> string. This will, of course, need to be changed.
>
> We've gone off-topic here so let's start a new thread in the ADO or the
> sql-servers newsgroup.
>
> Mervyn.
>
>
>
>
> clear
> s = seconds()
> d = new adodatabase()
> d.connectionString = "Provider=MSDASQL.1;Persist Security Info=True;Data Source=energydata"
> d.active = true
> try
> cStr = "CREATE TABLE energydata ( "
> cStr += " siteID CHAR(6) NOT NULL,"
> cStr += " eTimestamp TIMESTAMP(6) NOT NULL,"
> cStr += " egen FLOAT(10,4) DEFAULT NULL,"
> cStr += " econs FLOAT(10,4) DEFAULT NULL,"
> cStr += " ac FLOAT(10,4) DEFAULT NULL,"
> cStr += " pv_econs FLOAT(10,4) DEFAULT NULL,"
> cStr += " pv_eexp FLOAT(10,4) DEFAULT NULL,"
> cStr += " g_eimport FLOAT(10,4) DEFAULT NULL,"
> cStr += " PRIMARY KEY USING BTREE (siteID, eTimestamp))"
> d.ExecuteSQL(cStr)
> catch(exception e)
> ?e.message, 'Table exists'
> endtry
>
>
> _app.allowYeildOnMsg = true
> f = new file()
> f.open('d:\examples\ado\energydata2.csv')
> cRead = f.gets(1000) //header
> n = 0
> do while not f.eof()
> n1 = 1
> cStr = "insert into energydata (siteId,eTimestamp,egen,econs,ac,pv_econs,"
> cStr += "pv_eexp,g_eimport) values "
> do while n1 < 1000 and not f.eof()
> cRead = f.gets(10000)
> cStr += "("+parse_cRead(cRead)+"),"
> _app.executeMessages()
> if n%500 = 0
> ?n
> endif
> n++
> n1++
> enddo
> cStr = substr(cStr,1,len(cStr)-1) //get rid of last comma
> ?'insert'
> d.ExecuteSQL(cStr)
> enddo
> d.ExecuteSQL('commit')
> f.close()
> d.active = false
> ? n,' Records added '
> ?'seconds',(seconds()-s)
>
> function parse_cRead(cRead)
> //Excludes site field from the INSERT. Wraps siteID and eTimestamp in single quotes
> //Adds NULL in empty fields in the .csv file.
> local cRet
> cRet = "'"+substr(cRead,1,at(',',cRead,1)-1)+"','"
> cTs = substr(cRead,at(',',cRead,2)+1,(at(',',cRead,3)-1)-at(',',cRead,2)) +"',"
> cRet += convert_ts(cTs)
> cRet += substr(cRead,at(',',cRead,3)+1)
> do while ",,"$cRet
> cRet = stuff(cRet,at(',,',cRet),2,",NULL,")
> if substr(cRet,len(cRet),1) = ','
> cRet += 'NULL'
> endif
> enddo
> return cRet
>
> function convert_ts(cTs)
> //Reformats the timestamp as YYYY-MM-DD HH:MM:SS
> local cRet,cY,cH,cM,cS
> if not 'A'$cTs and not 'P'$cTs
> cRet = cTs
> else
> cY = substr(cTs,1,9)
> cY = stuff(cy,7,0,'-')
> cY = stuff(cy,5,0,'-')
> if 'P'$cTs and val(substr(cTs,10,2)) = 12
> cH = '00'
> elseif 'P'$cTs and val(substr(cTs,10,2)) < 12
> cH = val(substr(cTs,10,2))+12
> else
> cH = substr(cTs,10,2)
> endif
> cM = substr(cTs,13,2)
> cS = ":00',"
> cRet = cY+cH+':'+cM+cS
> endif
> return cRet
>
|