Bulk Insert csv into sql

I’m trying to bulk insert a csv file. I am using a timed gateway script. Below is the code, and the error I am getting. Any help is appreciated.

inputPath = ‘C:/IgniteFTP/ScheduleData/’

for fname in os.listdir(inputPath):
path = os.path.join(inputPath, fname)
if os.path.isdir(path):
continue
else:
bulkinsert = “”“BULK INSERT ScheduleData
FROM “”” + path + “”"
WHERE (
rowterminator = \n,
fieldterminator = ,^,
firstrow = 2 )
“”"
system.db.runPrepUpdate(bulkinsert)

ERROR
at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:357)

at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runPrepUpdate(AbstractDBUtilities.java:255)

at sun.reflect.GeneratedMethodAccessor105.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

java.lang.Exception: java.lang.Exception: Error executing system.db.runPrepUpdate(BULK INSERT ScheduleData
FROM C:/IgniteFTP/ScheduleData/053018hw.LIS
WHERE (
rowterminator =
,
fieldterminator = ,^,
firstrow = 2 )
, [null], , , false, false)

At first glance it looks like you need to add apostrophes to your csv path as well as terminators. Also, use WITH instead of WHERE

https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-2017

It looks like I got it cleaned up to have the single quotes and the WITH, still getting the error. code changes below.

import os, shutil, csv
inputPath = ‘C:/IgniteFTP/ScheduleData/’
newLine = r’\n’

for fname in os.listdir(inputPath):
path = os.path.join(inputPath, fname)
if os.path.isdir(path):
# skip directories
continue
else:
bulkinsert = “”“BULK INSERT ScheduleData
FROM '”"" + path + “”"’
WITH (
rowterminator = ‘""" + newLine + “”"’,
fieldterminator = ‘,^’,
firstrow = 2
);"""
system.db.runPrepUpdate(bulkinsert)

Can you post the new error?

Here is the new error. Thanks for the help

Traceback (most recent call last):
File “<TimerScript:GatewayScripts/ScheduleData @1,000ms >”, line 18, in
FROM ‘C:/IgniteFTP/ScheduleData/053018hw.LIS’
WITH (
rowterminator = ‘\n’,
fieldterminator = ‘,^’,
firstrow = 2
);, [null], , , false, false)

at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:357)

at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runPrepUpdate(AbstractDBUtilities.java:255)

at sun.reflect.GeneratedMethodAccessor105.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

java.lang.Exception: java.lang.Exception: Error executing system.db.runPrepUpdate(BULK INSERT ScheduleData
FROM ‘C:/IgniteFTP/ScheduleData/053018hw.LIS’
WITH (
rowterminator = ‘\n’,
fieldterminator = ‘,^’,
firstrow = 2
);, [null], , , false, false)

7.9.4 (b2017082911)
Oracle Corporation 1.8.0_151

This is running as a gateway script, so you need to specify the database connection to use in system.db.runPrepUpdate.

1 Like

Different error now.

import os, shutil, csv
inputPath = ‘C:/IgniteFTP/ScheduleData/’
newLine = r’\n’

for fname in os.listdir(inputPath):
path = os.path.join(inputPath, fname)
if os.path.isdir(path):
# skip directories
continue
else:
bulkinsert = “”“BULK INSERT ScheduleData
FROM '”"" + path + “”"’
WITH (
rowterminator = ‘""" + newLine + “”"’,
fieldterminator = ‘,^’,
firstrow = 2
);"""
system.db.runPrepUpdate(bulkinsert, “SQLServer”)

Error
Traceback (most recent call last):
File “<TimerScript:GatewayScripts/ScheduleData @1,000ms >”, line 18, in
at com.inductiveautomation.ignition.common.TypeUtilities.coerce(TypeUtilities.java:1311)

at com.inductiveautomation.ignition.common.script.builtin.PyArgumentMap.coerce(PyArgumentMap.java:108)

at com.inductiveautomation.ignition.common.script.builtin.PyArgumentMap.interpretPyArgs(PyArgumentMap.java:66)

at com.inductiveautomation.ignition.common.script.builtin.PyArgumentMap.interpretPyArgs(PyArgumentMap.java:36)

at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runPrepUpdate(AbstractDBUtilities.java:243)

at sun.reflect.GeneratedMethodAccessor105.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

java.lang.ClassCastException: java.lang.ClassCastException: Cannot coerce value ‘SQLServer’ into type: class [Ljava.lang.Object;

system.db.runPrepUpdate expects args as the second parameter and this is not optional. Database connection name goes after that.

I put null in as an argument, but now am getting a different error.
import os, shutil, csv
inputPath = ‘C:/IgniteFTP/ScheduleData/’
newLine = r’\n’
arg = ‘NULL’
for fname in os.listdir(inputPath):
path = os.path.join(inputPath, fname)
if os.path.isdir(path):
# skip directories
continue
else:
bulkinsert = “”“BULK INSERT ScheduleData
FROM '”"" + path + “”"’
WITH (
rowterminator = ‘""" + newLine + “”"’,
fieldterminator = ‘,^’,
firstrow = 2
);"""
system.db.runPrepUpdate(bulkinsert, [arg], “SQLServer”)

Traceback (most recent call last):
File “<TimerScript:GatewayScripts/ScheduleData @1,000ms >”, line 18, in
FROM ‘C:/IgniteFTP/ScheduleData/053018hw.LIS’
WITH (
rowterminator = ‘\n’,
fieldterminator = ‘,^’,
firstrow = 2
);, [NULL], SQLServer, , false, false)

at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:357)

at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runPrepUpdate(AbstractDBUtilities.java:255)

at sun.reflect.GeneratedMethodAccessor105.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

java.lang.Exception: java.lang.Exception: Error executing system.db.runPrepUpdate(BULK INSERT ScheduleData
FROM ‘C:/IgniteFTP/ScheduleData/053018hw.LIS’
WITH (
rowterminator = ‘\n’,
fieldterminator = ‘,^’,
firstrow = 2
);, [NULL], SQLServer, , false, false)

If you aren’t going to use arguments, why not use system.db.runUpdateQuery instead?

With runupdatequery it looks like i am getting the same error

Traceback (most recent call last):
File “<TimerScript:GatewayScripts/ScheduleData @1,000ms >”, line 18, in
FROM ‘C:/IgniteFTP/ScheduleData/053018hw.LIS’
WITH (
rowterminator = ‘\n’,
fieldterminator = ‘,^’,
firstrow = 2
);, SQLServer, , false)

at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.error(AbstractDBUtilities.java:357)

at com.inductiveautomation.ignition.common.script.builtin.AbstractDBUtilities.runUpdateQuery(AbstractDBUtilities.java:182)

at sun.reflect.GeneratedMethodAccessor405.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

java.lang.Exception: java.lang.Exception: Error executing system.db.runUpdateQuery(BULK INSERT ScheduleData
FROM ‘C:/IgniteFTP/ScheduleData/053018hw.LIS’
WITH (
rowterminator = ‘\n’,
fieldterminator = ‘,^’,
firstrow = 2
);, SQLServer, , false)

7.9.4 (b2017082911)
Oracle Corporation 1.8.0_151

If you have SSMS installed can you try running the bulk insert statement directly there?

BULK INSERT ScheduleData
FROM 'C:/IgniteFTP/ScheduleData/053018hw.LIS'
WITH (
rowterminator = '\n',
fieldterminator = ',^',
firstrow = 2 
);

This is what I get when trying to run from ssms. I think it might have to do with the sql account not having access to the file
Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file “C:\IgniteFTP\ScheduleData\053018hw.LIS” could not be opened. Operating system error code (null).

Yep, sounds like permissions issues. Please post back and let us know if that resolves everything!