Do destination là một database với tất cả các column có data type là nvarchar, có những file chứa Unicode thì thuộc tính CodePage là 65001 hoạt động không vấn đề gì. Tuy nhiên có những file chứa ký tự đặc biệt lại có Code Page là 1252, nếu vẫn giữ nguyên 65001 thì sẽ không load được những ký tự này.
Giải pháp đưa ra là trước khi bắt đầu xử lý dữ liệu trong Data Flow, chèn 1 Script Task xử lý để nhận dạng code page, sau đó truyền vô Flat File Connectino Manager.
public void Main() { // TODO: Add your code here Dts.TaskResult = (int)ScriptResults.Success; int codePage=EncodingDetector.GetEncodingCodePage(Dts.Variables["ConnectionStringFile"].Value.ToString()); if (codePage != 65001) { codePage = 1252; } Dts.Variables["CodePage"].Value= codePage; } } public class EncodingDetector { static bool Compare(byte[] b1, byte[] b2) { for (int i = 0; i < b1.Length; i++) { if (b1[i] != b2[i]) return false; } return true; } public static bool IsEncodedWith(Stream s, Encoding encoding) { var preamble = encoding.GetPreamble(); if (preamble == null || preamble.Length == 0) return false; try { var buffer = new byte[preamble.Length]; var count = s.Read(buffer, 0, buffer.Length); if (count != buffer.Length) return false; return Compare(buffer, preamble); } finally { s.Position = 0; } } public static Encoding GetEncoding(string filePath) { using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { if (IsEncodedWith(fs, Encoding.Unicode)) return Encoding.Unicode; if (IsEncodedWith(fs, Encoding.UTF32)) return Encoding.UTF32; if (IsEncodedWith(fs, Encoding.UTF8)) return Encoding.UTF8; if (IsEncodedWith(fs, Encoding.UTF7)) return Encoding.UTF7; return Encoding.ASCII; } } public static int GetEncodingCodePage(string filePath) { var en = GetEncoding(filePath); return en.CodePage; } }
0 comments:
Post a Comment