Вот проблема:
для справки:
Записи базы данных 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