使用 OLE DB (SQLOLEDB) 連接 SQL Server 2000 時,若數據庫排序規則與客戶端代碼頁不同,查詢返回字符變為 ? 或亂碼。微軟確認為 Bug,觸發條件:
1. 連接 SQL Server 2000
2. SSPROP_INIT_AUTOTRANSLATE = TRUE(默認開啟)
3. 列綁定為 DBTYPE_WCHAR
在連接屬性 Provider String 中加入 AutoTranslate=no。
SQLCA.DBMS = 'OLE DB'
SQLCA.LogID = 'sa'
SQLCA.LogPass = ''
SQLCA.DBParm = "PROVIDER='SQLOLEDB', DataSource='my-server', " & _
"CommitOnDisconnect='no', " & _
"ProviderString='Database=mydb, AutoTranslate=no'"
' ADO 連接串
"Provider=SQLOLEDB;Data Source=my-server;Initial Catalog=mydb;User ID=sa;Password=;Auto Translate=False"
' ADO.NET (OleDbConnection)
"Provider=SQLOLEDB;Data Source=my-server;Initial Catalog=mydb;User ID=sa;Password=;Auto Translate=False"
AutoTranslate 控制 OLE DB 提供程序是否在客戶端代碼頁與服務器排序規則之間自動轉換字符。關閉後,字符按原始字節傳輸,由應用層自行處理編碼,避免提供程序錯誤轉換導致亂碼。