mssql обрабатывает возврат строки довольно неловко - PullRequest
0 голосов
/ 10 декабря 2008

Вот проблема:

для справки:

http://i.stack.imgur.com/mmrNH.jpg

Записи базы данных 1, 2 и 3 сделаны с использованием jython 2.2.1 с использованием jdbc1.2. Запись в базе данных 4 выполняется с использованием vb старой программы для замены с использованием odbc.

Мы обнаружили, что если я копирую и вставляю записи jython и vb MailBody в wordpad непосредственно из этого программного обеспечения SQL Server Enterprise Manager, он выводит формат с правильной версией строки. если я сравниваю байты каждого файла с помощью шестнадцатеричного редактора или KDiff3, то они двоично одинаковы.

Существует сторонняя программа, которая использует эти данные. К сожалению, сторонняя программа считывает данные и для записей с 1 по 3 отображает данные без возврата строки. хотя для записи 4 он правильно форматирует текст. В качестве еще одного доказательства, которое мы видим на рисунке, данные в базе данных отображаются по-разному. Каким-то образом возвращаемые строки сохраняются в базе данных для записей vb, но в записях jython они пропускаются. если я нажму на поле «MailBody» в строке 4, я могу нажать вниз, чтобы увидеть остальную часть письма. Принимая во внимание, что данные для jython отображаются в одну строку.

Что дает, чего мне не хватает, и как мне с этим справиться? Вот фрагмент кода, куда я на самом деле отправляю его в базу данных.

РЕДАКТИРОВАТЬ: К вашему сведению: не обращайте внимания на расхождения в столбце «Обработано», это не имеет значения. РЕДАКТИРОВАТЬ: я хочу, чтобы jython-программа вводила данные так же, как и vb-программа. Так что сторонняя программа приедет и правильно отобразит данные. так что это будет выглядеть так: каждая запись в «MailBody» будет отображать «Это только тестирование!» затем следующая строка «и т. д.», поэтому, если бы я делал скриншот, все записи были бы похожи на запись 4 базы данных.

решено

добавить _force_CRLF к смеси:

def _force_CRLF(self, data):
    '''Make sure data uses CRLF for line termination.
    Nicked the regex from smtplib.quotedata. '''
    print data
    newdata = re.sub(r'(?:\r\n|\n|\r(?!\n))', "\r\n", data)
    print newdata
    return newdata

def _execute_insert(self):
    try:
        self._stmt=self._con.prepareStatement(\
            "INSERT INTO EmailHdr (EntryID, MailSubject, MailFrom, MailTo, MailReceive, MailSent, AttachNo, MailBody)\
             VALUES (?, ?, ?, ?, ?, ?, ?, cast(? as varchar (" + str(BODY_FIELD_DATABASE) + ")))")
        self._stmt.setString(1,self._emailEntryId)
        self._stmt.setString(2,self._subject)
        self._stmt.setString(3,self._fromWho)
        self._stmt.setString(4,self._toWho)
        self._stmt.setString(5,self._format_date(self._emailRecv))
        self._stmt.setString(6,self._format_date(self._emailSent))
        self._stmt.setString(7,str(self._attachmentCount))
        self._stmt.setString(8,self._force_CRLF(self._format_email_body()))
        self._stmt.execute()
        self._prepare_inserting_attachment_data()
        self._insert_attachment_data()
    except:
        raise

def _format_email_body(self):
    if not self._emailBody:
        return "could not extract email body"
    if len(self._emailBody) > BODY_TRUNCATE_LENGTH:
        return self._clean_body(self._emailBody[:BODY_TRUNCATE_LENGTH])
    else:
        return self._clean_body(self._emailBody)

def _clean_body(self,dirty):
    '''this method simply deletes any occurrence of an '=20' that plagues my output after much testing this is not related to the line return issue, even if i comment it out I still have the problem.''' 
    dirty=str(dirty)
    dirty=dirty.replace(r"=20","")
    return r"%s"%dirty

Ответы [ 2 ]

1 голос
/ 12 декабря 2008

Вам следует взглянуть на модуль quopri (и другие, касающиеся электронной почты), чтобы вам не приходилось использовать грязные трюки как _clean_body

1 голос
/ 10 декабря 2008

Предлагаю добавить отладочный вывод в вашу программу, сбрасывая коды символов перед вставкой в ​​БД. Есть вероятность, что Jython заменяет пару CrLf одним символом и не восстанавливает ее при записи в БД.

...