2009-10-14 84 views
1

作爲一個集成任務的一部分,我在數據庫中有一個列類型爲nvarchar(30),我需要調用一個WCF服務並通過這個值列(等等),然後將存儲在另一個數據庫中具有類型varchar(30)的列中。將數據從nvarchar轉換爲C#中的varchar

我應該怎麼做(大概在調用WCF服務的代碼中)將我的字符串轉換爲「varchar friendly」字符串?

更新:沒有什麼問題了。不過,我將通過此服務進行12萬條記錄的初始遷移,然後每天將推出約300條新記錄。因此,任何形式的人工干預都是非常不可取的,我只是在考慮可能提前發生什麼問題。我無法控制目標數據庫(使用VARCHAR列),但是我確實知道它是應用程序的SQL Server和C#(不知道它們是否使用ADO.NET)。

+0

我假設的Sql Server?使用ADO .NET訪問數據庫? – Mac 2009-10-14 06:50:09

+0

你有什麼具體問題? – Mac 2009-10-14 06:50:47

+0

Mac - 我會用你的解決方案(對我來說最簡單:)),如果事情開始破裂,我會報告回來。 – 2009-10-15 01:00:27

回答

8

什麼你要做的:在.NET are UTF-16 encoded所有字符串:

  • 當您檢索您的NVARCHAR列(使用ADO.NET我假設)時,您會自動獲取.NET字符串(UT F-16,任何必要的轉換都是自動的)。
  • 當您將此.NET字符串存儲在VARCHAR列中時,也會自動執行UTF-16的任何必要轉換。

See here有關ADO .NET中Sql Server的數據類型映射的更多信息。

您只需確保所有字符串都可以完美地從源字符集轉換爲目標字符集。

+0

UTF-16或UCS-16? – 2009-10-14 06:44:10

+0

根據我剛剛添加的鏈接,UTF-16。 – Mac 2009-10-14 06:48:59

+0

我認爲我應該對字符集之間的轉換保持安全,因爲絕大多數字符集都是純英文的,但該網站在國際上可用,所以如果人們開始使用非英語內容會發生什麼情況會很有趣。 – 2009-10-15 01:04:46

1

如果目標列表示ASCII字符,以便只需使用Encoding.Convert方法

例如:

Encoding.ASCII.GetString(Encoding.Convert(Encoding.Unicode, Encoding.ASCII, bytes)) 
1

你的問題不是數據類型,而是數據。所有可存儲爲nvarchar的值在varchar中都沒有等效值(具體取決於排序規則)。如果第二個數據庫在您的控制之下,那麼傳遞數據最麻煩的方式是現在將varchar字段更改爲nvarchar。

如果您無法做到這一點,那麼您需要在發送數據之前檢查數據,以確保數據可以轉換。根據數據問題的種類,您可能需要刪除不會轉換或替換爲其他字符的字符,或將記錄放入某種類型的保留表中,而不是發送給它以進行修復。艾哈邁德的建議看起來像一個可能性,我沒有嘗試過,所以我不知道它是否會工作。您可能很幸運,並且沒有任何數據問題(並非每個使用nvarchar的數據庫都使用任何具有正確的國家/地區整理的varchar字符),但您必須計劃解決該問題。

+0

鑑於我們的目標受衆,絕大多數內容應該與varchar兼容。然而,該網站是國際上可用的,所以我會密切關注正在轉換的內容,並在出現/出現時跨越該橋。 – 2009-10-15 01:03:14

+0

當我將公司名稱(❤tech)放在您的聯繫表單上時,該怎麼辦?我說英語,但我仍然喜歡使用非ansi字符 – 2013-04-11 14:35:06