Ecco una possibile soluzione, ma non è stata testata, quindi tienila a mente!
Qualche tempo fa mi sono imbattuto in un problema simile con caratteri speciali in Oracle. Abbiamo il nostro personaggio impostato su UTF-16. Aveva cose strane come dieresi e altri caratteri ascii al di fuori del normale intervallo 32-127.
Una cosa che potresti provare è prima eseguire una codifica HTML in qualsiasi cosa al di fuori di quell'intervallo, caricandolo nel tuo datatable in c#, quindi mentre il datatable si sta riempiendo (o dopo che è stato riempito...), esegui una decodifica html su quei campi.
Abbiamo una funzione di codifica html che fa questo per noi, in questo modo:
FUNCTION HTML_Encode_Special_Characters
(p_string IN VARCHAR2,
p_do_encode IN VARCHAR2 DEFAULT 'Y')
RETURN VARCHAR2 IS
first_location number := REGEXP_INSTR(p_string, '([^' || CHR(1) || '-' || CHR(127) || '])');
v_string VARCHAR2(32000);
v_char VARCHAR2(1 char);
v_ascii_number number;
BEGIN
IF p_do_encode = 'Y' AND first_location > 0 THEN
v_string := p_string;
FOR i IN first_location .. length(v_string) LOOP
v_char := substr(v_string,i,1);
v_ascii_number := ascii(v_char);
IF v_ascii_number > 128 THEN
-- just replace all of them
v_string := REPLACE (v_string, v_char,'&#' || v_ascii_number || ';');
END IF;
END LOOP;
RETURN (v_string);
ELSE
RETURN p_string;
END IF;
END;
Quindi questo dovrebbe caricare i dati "stringa" nella tua tabella e in ogni caso in cui hai caratteri speciali, verrebbe visualizzato come "½" o qualcosa del genere.
Quindi sul lato C# potresti fare qualcosa con la decodifica html:
using System.Web;
HttpUtility.HtmlDecode(mystring);
Di nuovo... non testato. Ma dovrebbe essere molto facile da implementare, testare e/o modificare leggermente per farlo funzionare.
Una soluzione alternativa sarebbe anche quella di eseguire semplicemente un datafix sul database per modificare tutti quei caratteri speciali in rappresentazioni "normali" (ad esempio, un trattino em in un trattino normale). Puoi farlo con alcune espressioni regolari, usando la funzione CHR(), e per visualizzare dati dispari usando la funzione DUMP().