游标fastexecutemany错误:('HY000','HY000][Microsoft][SQL Server本机客户端11.0]Unicode转换失败(0)(SQLExecute)'))

2024-10-01 13:39:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用cursor fast_ExecuteMy将几个大型csv文件上载到sql server数据库中。下面是代码示例

  if item.endswith(zip_ext):
      file_name = os.path.abspath(item)
      zip_ref = zipfile.ZipFile(file_name)
      zip_ref.extractall(directory)
      zip_ref.close()
      os.remove(file_name)

for item in os.listdir(directory): # Load and Edit CSV
   if item.endswith(ext):
       df = pd.read_csv(item)
       df.rename(columns={df.columns[0]:'InvoiceNo',df.columns[2]:'OrderNo',df.columns[20]:'Syscode',
                          df.columns[27]:'SpotDate',df.columns[28]:'Network',df.columns[30]:'SpotTime',
                          df.columns[29]:'SpotLength',df.columns[31]:'Program',df.columns[32]:'SpotName',
                          df.columns[21]:'Source'},inplace=True)
      
       df['BillDate']='2021-03-01' # Enter Preferred Bill Date Here!
       df['FileName']=str(item)
       df[['SpotDate','BillDate','SpotTime']]=df[['SpotDate','BillDate','SpotTime']].apply(pd.to_datetime)
       df['SpotTime']=df['SpotTime'].dt.time
       df['OrderNo']=df['OrderNo'].apply(lambda x: '' if x == 'NULL' else x)
       df = df[['InvoiceNo', 'OrderNo', 'BillDate', 'Syscode', 'SpotDate', 'Network', 'SpotTime', 'SpotLength',
               'Program', 'SpotName', 'Source', 'FileName']]
       
# Connect to SQL Server
       conn = pyodbc.connect('DRIVER=SQL Server Native Client 11.0;'
                             'SERVER=PWDBS006SQL;' #UPDATED 2/4/21
                             'DATABASE=Marketing Cross-Channel Affidavits;'
                             'Trusted_Connection=yes;',
                             autocommit=True)
       crsr = conn.cursor()
       crsr.fast_executemany = False
       
# Insert Df to SQL
       sql_statement = '''INSERT INTO dbo.SpectrumReach_Marketing (InvoiceNo, OrderNo, BillDate, Syscode, SpotDate,
                        Network, SpotTime, SpotLength, Program, SpotName, Source, FileName)
                        VALUES (?,?,?,?,?,?,?,?,?,?,?,?)'''
       list_of_tuples = list(df.itertuples(index=False))
       crsr.executemany(sql_statement, list_of_tuples)
       
       crsr.close()
       conn.close() 

运行此代码时,我收到错误消息:('HY000','HY000][Microsoft][SQL Server本机客户端11.0]Unicode转换失败(0)(SQLExecute)')

我已经将这段代码用于来自几个来源的几个大型数据集,这些数据集的格式应该完全相同,并且它已经工作了,但是对于特定的供应商,它中断并显示了上述错误。此外,当我的fast_executemany=False时,此代码会运行,但由于我尝试传输的文件的大小,因此不可能将数据上传得那么慢

任何帮助都将不胜感激


Tags: columns代码dfsqlifzipitemfile