Поймать Python исключение в базе данных MS SQL - PullRequest
0 голосов
/ 09 мая 2020

я использую 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?

Мэнни, спасибо, Эрик

...