я использую Python 3.6.9 в сочетании с pyodb c. Я создаю функцию с python, чтобы читать письмо и записывать его в базу данных. Иногда получаются неверные данные, которые я пытаюсь отловить в таблице журналов с помощью простой процедуры. Недействительные данные обнаруживаются с помощью попытки , кроме e . См. Следующий код:
ПРОЦЕДУРА DDL
CREATE procedure wp_ra.toevoegenLogRegel
@ERROR_STATE VARCHAR(MAX)
,@ERROR_NUMBER VARCHAR(MAX)
,@ERROR_SERVERITY VARCHAR(MAX)
,@ERROR_PROCEDURE VARCHAR(MAX)
,@ERROR_LINE VARCHAR(MAX)
,@ERROR_MESSAGE VARCHAR(MAX)
,@PROCEDURE_VALUE VARCHAR(MAX)
as
BEGIN
BEGIN TRAN
INSERT INTO [wpa_ra].[log] ( receivingdate
,ERROR_NUMBER
,ERROR_STATE
,ERROR_PROCEDURE
,ERROR_LINE
,ERROR_MESSAGE
,PROCEDURE_VALUE
)
VALUES (GETDATE()
, @ERROR_NUMBER
, @ERROR_SERVERITY
, @ERROR_PROCEDURE
, @ERROR_LINE
, @ERROR_MESSAGE
, @PROCEDURE_VALUE
)
COMMIT
END
ТАБЛИЦА DDL
CREATE TABLE wp_ra.log (
receivingdate varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
ERROR_NUMBER varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
ERROR_STATE varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
ERROR_SEVERITY varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
ERROR_PROCEDURE varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
ERROR_LINE varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
ERROR_MESSAGE varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
PROCEDURE_VALUES varchar(MAX) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) GO
Python Код
try:
values = ()
values = (r['DatumOntvangst']
, r['OntvangenVan']
, r['Onderwerp']
, r['extref']
, r['functietitel']
, r['startdatum']
, r['Einddatum']
, r['AantalPosities']
, r['locatie']
, r['UrenPerWeek']
, r['Beschrijving']
, r['id']
, r['MaxUurTarief'])
sql = "EXEC [wp_ra].[invoeren_mail_classified] ?, ?, ?, ?, ?, ?, ?, ? ,? ,? , ?, ?, ?"
cur_insert.execute(sql, (values))
cur_insert.commit()
except Exception as e:
try:
values = ()
values = (
str("Fout in Waarde") #Error State
, r['id'] #Error number
, str("ttt") #Error surverity
, str("wp_ra.invoeren_mail_classified" ) #error Procedure
, str("ttt") #Error Line
, str(e) #Error Message
, r["DatumOntvangst"] ) #Procedure Value
sql = "EXEC wp_ra.toevoegenLogRegel ?,?,?,?,?,?,?"
cur_insert.execute(sql, (values))
cur_insert.commit()
except Exception as e:
logging.error('------------- LOG ERROR MAIL CLASSIFIED ------------------')
logging.error('Failed to "EXEC wp_ra.toevoegenLogRegel: ')
logging.error( str(e) )
logging.error( values )
Но я все еще получаю ошибки из исключения, когда пытаюсь вставить в таблицу журнала:
[5/9/20 7:18:42 AM] ------------- LOG ERROR MAIL CLASSIFIED ------------------
[5/9/20 7:18:42 AM] Failed to "EXEC wp_ra.toevoegenLogRegel:
[5/9/20 7:18:42 AM] ('42S02', "[42S02] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name 'wpa_ra.log'. (208) (SQLExecDirectW)")
[5/9/20 7:18:42 AM] ('Fout in Waarde', 416, 'ttt', 'wp_ra.invoeren_mail_classified', 'ttt', "('22007', '[22007] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Conversion failed when converting date and/or time from character string. (241) (SQLExecDirectW)')", '20200106')
Когда я анализирую его в SQL Management Studio Я заметил, что в значении исключения используются обе цитаты:
"('22007', '[22007] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Conversion failed when converting date and/or time from character string. (241) (SQLExecDirectW)')".
SQL Сервер исключает только одинарные или двойные кавычки, поэтому он возвращает ошибку. Есть ли способ отформатировать ошибку, за исключением того, что она будет выдана сервером MS SQL?
Мэнни, спасибо, Эрик