2008-12-10 8 views
0

Voici le problème:MSSQL gère la ligne retourne plutôt gauchement

pour votre référence:

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

base de données entrées

1,2 et 3 sont à l'aide Jython 2.2.1 en utilisant jdbc1.2. L'entrée de la base de données 4 est faite en utilisant vb l'ancien programme à remplacer en utilisant odbc.

Nous avons trouvé que si je copier et coller les deux entrées de Jython et vb mailBody à WordPad directement à partir de ce logiciel Enterprise Manager SQL Server, il transmet le format parfaitement avec retours à la ligne correcte. si je compare les octets de chaque fichier avec un éditeur hexadécimal ou KDiff3, ils sont identiquement identiques.

Il existe un programme tiers qui consomme ces données. Malheureusement, ce programme tiers lit les données et pour les entrées 1 à 3 il affiche les données sans retour de ligne. Cependant, pour l'entrée 4, il formate correctement le texte. Comme preuve supplémentaire que nous pouvons voir sur l'image, les données dans la base de données sont affichées différemment. D'une certaine façon, les retours de ligne sont conservés dans la base de données pour les entrées vb, mais les entrées jython sont ignorées. si je clique sur le champ d'entrée 'MailBody' 4 je peux appuyer vers le bas je peux voir le reste de l'email. Alors que les données pour Jython sont affichées dans une ligne.

Qu'est-ce qui donne, qu'est-ce qui me manque, et comment puis-je gérer cela? Voici un extrait du code où je l'envoie réellement à la base de données.

EDIT: FYI: s'il vous plaît ne tenez pas compte des différences dans la colonne 'Processed', ce n'est pas pertinent. EDIT: ce que je veux faire, c'est que le programme jython entre les données de la même manière que le programme vb. Alors que le programme 3ème partie viendra et affichera correctement les données. alors à quoi ressemblera chaque entrée dans 'MailBody' affichera "Ceci est un test seulement!" puis la ligne suivante « etc etc » donc si je devais faire une copie d'écran toutes les entrées ressembleraient entrée de la base de données 4.

SOLVED

ajouter _force_CRLF au mélange:

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 
+0

S'il vous plaît ne pas ajouter « Modifier Résolu ». Publiez votre solution en tant que réponse ou fermez la question. Edit Solved est déroutant. –

Répondre

1

Je suggère ajouter une sortie de débogage à votre programme, en vidant les codes de caractères avant l'insertion dans DB. Il y a des chances que Jython remplace la paire CrLf par un seul caractère et ne le restaure pas lorsqu'il est écrit dans DB.

+0

lorsque je publie les informations de débogage, la mise en forme est correcte. s'il vous plaît noter ce http://mail.python.org/pipermail/spambayes/2003-April/004477.html aucune connexion? – Setori

+0

homme correct! agréable! – Setori

+0

semble bonnes réponses et le vote est désactivé !! de toute façon laissez-moi mettre à jour les informations de débogage je l'ai fait. – Setori

1

Vous devriez regarder le module quopri (et d'autres en ce qui concerne e-mail) afin que vous ne devez pas utiliser de sales tours comme _clean_body

+0

cool homme merci pour la pointe – Setori

Questions connexes