Я вызываю скрипт Python из C #, В скрипте Python мы вызываем процедуру SQL.Когда пользователь загружает файл, содержащий 2,4 миллиона записей.Он прекрасно вызывает Python-скрипт из C #, а затем Python, запускающий процедуру и получающий данные, успешно вставляет таблицу, но при возврате процесса снова в C # он показывает, что время ожидания ошибки истекло.период ожидания истек до завершения операции или сервер не отвечает в C #
Это работало нормально в течение одного года, неожиданно показывая эту ошибку пользователям, но данные были успешно добавлены в БД
Я не понимаю, почему это происходит.Недавно ip сервера был изменен, я не знаю, это может вызвать изменение настроек в IIS или проблемы с кодом
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "C:/Program Files/Python 3.5/python.exe";
//startInfo.FileName = "C:/Program Files (x86)/Python/python.exe";
//startInfo.Arguments = "C:/PythonScripts/Test.py " + expat + " " + entity + " " + country;
//startInfo.Arguments = HttpContext.Server.MapPath("~/PythonScripts/Test.py").ToString() + " " + expat + " " + entity + " " + country;
startInfo.Arguments = "C:/inetpub/wwwroot/File_Upload/PythonScripts/Test.py" + expat + " " + entity + " " + country;
startInfo.Verb = "runas";
startInfo.UseShellExecute = false;
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
process.StartInfo = startInfo;
bool t = process.Start();
StreamReader myStreamReader = process.StandardError;
string error = myStreamReader.ReadToEnd();
StreamReader reader = process.StandardOutput;
string output = reader.ReadToEnd();
process.WaitForExit();
process.Close();
Python-скрипт, вызывающий из c #
import pandas as pd
import pyodbc
import numpy as np
import sys
#import time
try:
expat = (sys.argv[1])
entity = ""
country = ""
if(sys.argv[1] == "Local"):
entity = sys.argv[2]
country = sys.argv[3]
#start_time = time.time()
df = pd.read_excel("C:\PythonScripts\TestPayBook.xlsx")
#df = pd.read_excel("C:\inetpub\wwwroot\File_Upload_Wind_Auth\PythonScripts\TestPayBook.xlsx")
server = 'xxxxxxxx'
database = 'xxxxxx'
username = 'xxxxxx'
password = 'xxxxxxxx'
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password+';TDS_Version=7.2;autocommit=False')
cursor = cnxn.cursor()
if expat == "Local":
entityList = entity.split(',');
query = "select Mapping_Column, Source_Column from Tb_Payroll_ExcelMapping where country = '"+ country +"' and [ENTITY] in (" + ','.join( ('\'' + x + '\'') for x in entityList) + ")"
cursor.execute(query)
rows = cursor.fetchall()
ColumnMapping = {}
for row in rows:
ColumnMapping[row.Mapping_Column] = row.Source_Column
newColumns = {}
columns = list(df.columns.values)
for x in columns:
if x in ColumnMapping:
newColumns[x] = ColumnMapping[x]
df = df.rename(columns = newColumns)
values = {'EXIT DATE': '1900-01-01', 'DATE OF JOINING': '9999-01-01', 'DOB': '1900-01-01'}
df = df.fillna(value=values)
df1 = df.replace(np.nan, '', regex=True)
df_melt = df1.melt(id_vars=['PAY YEAR','PAY MONTH','EMPLOYEE ID','NAME','COUNTRY','CATEGORY','GRADE','BAND','EXPAT/LOCAL',
'GATP/NON GATP','DESIGNATION','LOCATION / ENTITY','GENDER',
'DOB','AGE','DATE OF JOINING','TENURE','PRODUCT','COST CENTRE','EXIT STATUS',
'EXIT DATE','EXIT REASON','CURRENCY','DEPARTMENT'])
paymonthlist = df_melt.get("PAY MONTH").unique().tolist()
payyearlist = df_melt.get("PAY YEAR").unique().tolist()
paycountrylist = df_melt.get("COUNTRY").unique().tolist()
paylocationlist = df_melt.get("LOCATION / ENTITY").unique().tolist()
payexpatlist = df_melt.get("EXPAT/LOCAL").unique().tolist()
cursor.fast_executemany = True
DeleteQuery = 'Delete from TB_PAYROLL_TRANS where [PAY MONTH] in ('+ ','.join( ('\'' + x + '\'') for x in paymonthlist) + ') and [PAY YEAR] in (' + ','.join(str(x) for x in payyearlist) + ') and COUNTRY in (' + ','.join( ('\'' + x + '\'') for x in paycountrylist) + ') and [LOCATION / ENTITY] in (' + ','.join( ('\'' + x + '\'') for x in paylocationlist) + ') and [EXPAT/LOCAL] in (' + ','.join( ('\'' + x + '\'') for x in payexpatlist) + ')'
cursor.execute(DeleteQuery)
#print("DeleteQuery done")
#print("--- %s seconds ---" % (time.time() - start_time))
params = [tuple(x) for x in df_melt.values]
BulkInsertQuery = '''Insert into TB_PAYROLL_TRANS_JUNC ([PAY YEAR], [PAY MONTH], [EMPLOYEE ID], NAME, COUNTRY, CATEGORY, GRADE, BAND, [EXPAT/LOCAL], [GATP/NON GATP]
,DESIGNATION, [LOCATION / ENTITY], GENDER, DOB, AGE, [DATE OF JOINING], TENURE, PRODUCT, [COST CENTRE], [EXIT STATUS], [EXIT DATE], [EXIT REASON], CURRENCY,DEPARTMENT, variable, value )
values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'''
for i in range(0, len(params), 1000):
subTuple = tuple(params[i:i+1000])
cursor.executemany(BulkInsertQuery,subTuple)
#print("Insert done: ", end=" ")
#print(i)
#print("--- %s seconds ---" % (time.time() - start_time))
#cursor.executemany(BulkInsertQuery,params)
#print("Insert done")
#print("--- %s seconds ---" % (time.time() - start_time))
cursor.execute("EXEC [TB_DATA_REPO].P_Payroll_Trans_Junction")
cnxn.commit()
except IOError:
print('An error occured trying to upload the file.')
> execution timeout expired. the timeout period elapsed prior to
> completion of the operation or the server not responding in C#