2008-12-10 30 views
0

這裏的問題是:MSSQL處理線返回而笨拙

,供大家參考:1,2和3使用Jython 2.2.1使用jdbc1.2取得

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

數據庫條目。 數據庫入口4是用vb做成的,用odbc替換程序。

我們發現,如果我直接從該SQL Server企業管理器軟件複製並粘貼jython和vb MailBody條目到wordpad,它將以完全正確的線返回格式輸出格式。如果我將每個文件的字節與十六進制編輯器或KDiff3進行比較,則它們的二進制完全相同。

有一個第三方程序使用這些數據。令人遺憾的是,第三方程序讀取數據,並且對於條目1至3,它顯示沒有線返回的數據。儘管對於條目4,它正確地格式化文本。作爲我們可以在圖片中看到的進一步證明,數據庫中的數據顯示方式不同。 不知怎的,行返回保存在數據庫中的vb條目,但它們被忽略的jython條目。如果我點擊條目4的'MailBody'字段,我可以按下我可以看到電子郵件的其餘部分。而jython的數據顯示在一行中。

什麼給,我錯過了什麼,以及如何處理? 這是我實際發送給數據庫的代碼片段。編輯:供參考:請忽略'已處理'欄中的差異,這是無關緊要的。 編輯:我想要做的就是讓jython程序以與vb程序相同的方式輸入數據。這樣第三方程序就會出現並正確顯示數據。 所以它看起來像是'MailBody'中的每個條目都會顯示「This is a testing only!」然後下一行「等等等等」,所以如果我是做一個screendump所有條目將類似於數據庫條目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 
+0

請不要添加「編輯解決」。請將您的解決方案作爲答案發布或結束問題。編輯解決困惑。 – 2008-12-10 11:07:10

回答

1

我建議添加一個調試輸出到您的程序,在插入數據庫之前轉儲字符代碼。 Jython有可能用單個字符替換CrLf對,並且在寫入數據庫時​​不會恢復它。

+0

當我輸出調試信息時,有正確的格式。 請注意這個http://mail.python.org/pipermail/spambayes/2003-April/004477.html任何連接? – Setori 2008-12-10 05:43:18

+0

正確的人!太好了! – Setori 2008-12-10 05:49:11

1

你應該看看quopri模塊(和其他有關的電子郵件),所以你不必使用骯髒的把戲,_clean_body