mssql lida com linha retornos meio desajeitadamente

votos
0

Aqui está o problema:

para sua referência:

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

entradas do banco de dados de 1,2 e 3 são feitas usando jython 2.2.1 utilizando jdbc1.2. entrada de dados 4 é feita usando vb o velho para ser substitua programa usando ODBC.

Descobrimos que se eu copiar e colar as duas entradas Jython e MailBody vb para o WordPad diretamente do que o software SQL Server Enterprise Manager ele gera o formato perfeitamente com os retornos de linha corretos. se eu comparar os bytes de cada arquivo com um editor hex ou KDiff3 eles são binários de forma idêntica o mesmo.

Há um terceiro programa do partido que consome esses dados. Infelizmente esse programa 3rd party lê os dados e para as entradas de 1 a 3 apresenta os dados sem linha de retornos. embora para a entrada 4 formata corretamente o texto. Como futher prova podemos ver na imagem, os dados no banco de dados é exibida de forma diferente. De alguma forma, a linha retornos são preservados no banco de dados para as entradas vb, mas as entradas Jython eles são negligenciados. se eu clicar no campo de entrada 4 a 'MailBody' i pode pressionar para baixo eu posso ver o resto do e-mail. Considerando os dados para jython é exibido em uma linha.

O que dá, que eu estou ausente, e como faço para lidar com isso? Aqui está um trecho do código onde eu realmente enviá-lo para o banco de dados.

EDIT: FYI: desconsidere as discrepâncias na coluna 'processados', é irrelevante. EDIT: o que eu quero fazer é ter a entrada de programa jython os dados da mesma forma como o programa vb. Assim que o terceiro programa do partido vai vir e exibir corretamente os dados. Então, o que ele vai olhar como está cada entrada na 'MailBody' exibirá Este é apenas um teste! em seguida, próxima linha etc etc por isso, se eu estava a fazer um screendump todas as entradas que se assemelham a entrada do banco de dados 4.

RESOLVIDO

adicionar _force_CRLF à mistura:

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 IGNORE  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
Publicado 10/12/2008 em 06:10
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Você deve olhar para o módulo quopri (e outros sobre e-mail) para que você não tem que usar truques sujos como _clean_body

Respondeu 12/12/2008 em 15:06
fonte usuário

votos
1

Eu sugiro para adicionar uma saída de depuração para o seu programa, despejando códigos de caracteres antes da inserção no DB. Há chances de que Jython substituir CrLf par com carácter único e não restaurá-lo quando escrito para DB.

Respondeu 10/12/2008 em 06:36
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more