2013-03-19 61 views
3

我遇到了使用LiveCode的問題,但我不知道問題出在哪裏,或者是否與ODBC驅動程序有關。使用LiveCode通過ODBC從SQL Server檢索unicode數據

LiveCode中內置的應用程序通過ODBC定期連接到SQL Server數據庫,以檢索各種數據。

負責該數據庫的應用程序正在升級,並作爲其中的一部分,所有的文本字段都被轉化爲Unicode文本字段。實質上,這意味着之前定義爲varchar的字段現在被定義爲nvarchar,而之前定義爲文本的字段現在定義爲ntext。 (這是順便說一下SQL Server 2008中。)

使用我們一直在過去使用的查詢,我們現在得到一個字符(在該領域的第一個字符),而不是整個文本。我可以解決這個現在在選擇查詢指定轉換爲varchar,例如當用來製造像 SELECT ID的請求的應用程序,名字從TAB1 現在使得像 SELECT ID的請求,轉換(VARCHAR (255),name)AS name FROM tab1

這就行得通 - 我找回了我以前得到的東西 - 但(a)它很笨拙,(b)現在很好,當客戶端正在遷移所有現有的數據存入數據庫,但遲早他們可能會利用這種升級的方式在字段中輸入一些Unicode字符,然後我大概不會把它們拿出來。

不幸的是我沒有訪問數據庫或應用程序,以便插入測試數據 - 但我假設會出現這樣的問題 - 最有可能不會很明顯,即有將只是一個微妙的問題,我的應用程序不處理輸入的數據(但認爲是)。

所以:是有辦法,一個LiveCode應用程序,使用當前的ODBC驅動程序,可以從一個nvarchar或ntext字段檢索正確完整的數據?

+0

您目前使用哪些代碼從數據庫中提取數據? – runrevmark 2013-03-20 13:11:55

+0

查看以下Monte的答案 - 真正使用'revdb_query','revdb_movenext'和'revdb_columnbynumber',但是嘗試使用'revQueryDatabase' /'revMoveToNextRecord' /'revDatabaseColumnNumbered'來代替,並且產生了相同的(錯誤的)結果。 在同一數據庫的測試應用程序中使用'revDataFromQuery'確實會檢索完整的數據,但不幸的是在這個應用程序中不是一個簡單的選項。 – 2013-03-21 12:39:21

+0

你在使用revDatabaseColumnNumbered()的結果,還是在第三個參數中使用「持有者變量」?由於UTF-16是二進制數據,因此不能使用結果。 – runrevmark 2013-03-21 13:22:32

回答

0

嗯。取決於轉換髮生的位置。我沒有處理這一個,所以採取一粒鹽......

如果整個unicode結果是通過odbc驅動程序和LiveCode的db層的方式,那麼你應該能夠unidecode結果。它看起來像回來了雙字節字符,第二個字節是零,如果它被視爲單字節字符,它將無效終止字符串。如您所述,這是在SQL請求中轉換爲varchar時發生的情況。

如果轉換髮生在odbc圖層或LC的db圖層中,那麼在運行到開源並且可以重寫以處理unicode之前,您是不走運的。

所以,我要說不做轉換爲varchar,試圖研究它之前unidecode的結果,你有看到你所期望的一個很好的機會。

1

是否有可能使用revDataFromQuery而不是更健壯的revQueryDatabase?我不使用revDataFromQuery,但我的猜測是它使用不支持UTF16的c字符串函數。

+0

[對不起,SO編輯限制犯規] 其實它看起來是相反的。我現在使用一般SQL工具檢索示例數據(我沒有交互式訪問此數據庫 - 可以將編譯的應用程序放在有權訪問的框中)。針對您的評論,我檢查了兩個應用程序(兩年前我寫過這兩個應用程序):真正的應用程序沒有獲取Unicode數據,它使用revdb_query/revdb_columnbynumber/revdb_movenext;而成功檢索數據的雜亂工具使用revDataFromQuery。 – 2013-03-21 09:30:18

+0

關於什麼是新的和什麼是新名稱,文檔似乎有點困惑:'revQueryDatabase'被認爲是'revdb_query'的同義詞,而'revMoveToNextRecord'和'revDatabaseColumnNumbered'被記錄爲新函數,與'revdb_movenext'和' revdb_columnbynumber'。 @Monte - 你似乎對內部知識有所瞭解 - 這是一個文檔混淆,還是有可能雖然revQueryDatabase只是一個同義詞,但同一套件的其他部分已經以更復雜的方式重新實現了? – 2013-03-21 09:35:31

+0

我不知道內部。我正在猜測。這兩個應用程序的查詢是否相同? – 2013-03-21 12:05:27

0

因此,爲了所有人都能看到這個問題:事實證明,如果我只是閱讀正確的文檔,我應該想出這個問題 - 是我在簡單中使用了revDatabaseColumnNumbered模式 -

put revDatabaseColumnNumbered(iConnID, iColNum) into tData 

...但是該模式只能返回文本,這不是我們在這裏所實現的,而是二進制數據。因此,解決辦法是使用第二模式,

get revDatabaseColumnNumbered(iConnID, iColNum, "tData") 

...在這一點就得到了完整的Unicode數據,然後可以決定用它做什麼。根本沒有revQueryDatabase代碼路徑的問題,只是我的錯誤在我如何使用revDatabaseColumnNumbered

感謝所有試圖幫助我的人!