2017-08-24 2 views
-1

J'utilise le code suivant pour affecter du texte à un paramètre SQL:comment utiliser la fonction « Copier » pour attribuer une valeur UTF-8 à une variable

quInsert.Parameters.ParamByName('veh_type').value := copy(s,11,1); 

Parfois, le texte dans le fichier .txt Je suis lecture de est en UTF-8, qui a des caractères en utilisant deux octets. Comment puis-je modifier le code suivant pour accepter les données UTF-8?

procedure TPrepareform.Button1Click(Sender: TObject); 
var 
    f : textfile; 
    s : string; 
    i : integer; 
    IsAnsiString : Boolean; 
begin 
    with quInsert do 
    begin 
    close; 
    sql.clear; 
    sql.add('insert into v_info_2018'); 
    sql.add('(record_type, plate_group, plate_no, v_type, v_type_cn,'); 
    sql.add('v_type_pt, v_type_pt, v_brand, engine_no, ct_tax_amount'); 
    sql.add('inspect_date, record_date'); 
    sql.add('values (:record_type, :plate_group, :plate_no, :v_type, :v_type_cn, :v_type_pt, :v_type_pt,'); 
    sql.add(':v_brand, :engine_no, :ct_tax_amount,'); 
    sql.add(':inspect_date, :record_date'); 
    end; 
    i := 0; 
    assignfile(f,edMasterName.Text); 
    reset(f); 
    while not eof(f) do 
    begin 
    readln(f,s); 
    inc(i); 
    end; 
    prInsert.Max := i; 
    i := 0; 
    reset(f); 
    VRS_Main.StatusBar1.Panels[5].Text:='0'; 
    while not eof(f) do 
    begin 
    inc(i); 
    prInsert.StepIt; 
    readln(f,s); 
    quInsert.Parameters.ParamByName('record_type').value := copy(s,1,1); 
    quInsert.Parameters.ParamByName('plate_group').value := copy(s,2,1); 
    quInsert.Parameters.ParamByName('plate_no').value := copy(s,3,8); 
    quInsert.Parameters.ParamByName('v_type').value := copy(s,11,1); 
    quInsert.Parameters.ParamByName('v_type_cn').value := UTF8Decode(copy(s,12,50)); 
    quInsert.Parameters.ParamByName('v_type_pt').value := copy(s,62,50); 
    quInsert.Parameters.ParamByName('v_brand').value := copy(s,112,30); 
    quInsert.Parameters.ParamByName('engine_no').value := copy(s,142,50); 
    quInsert.Parameters.ParamByName('ct_tax_amount').value := copy(s,192,9); 
    quInsert.Parameters.ParamByName('inspect_date').value := copy(s,201,50); 
    quInsert.Parameters.ParamByName('record_date').value := copy(s,251,8); 
    quInsert.ExecSQL; 
    VRS_Main.StatusBar1.Panels[5].Text:=inttostr(strtoint(VRS_Main.StatusBar1.Panels[5].Text)+1); 
    end; 
end; 

image

+0

Quel est le codage utilisé par la base de données? Est-il même configuré pour accepter Unicode? –

+0

c'est Windows SQL Server 2008 R2 – kaihong

+0

Votre SQL est mal formé. Sur ces deux lignes: 'sql.add ('inspect_date, record_date');' et 'sql.add (': inspect_date,: record_date');', il vous manque une fermeture ')' après 'record_date' et': record_date', respectivement. Votre SQL ressemble à ceci lors de l'exécution: ''insérer dans v_info_2018 ( valeurs (' ', quand il devrait ressembler à ceci:'' insérer dans v_info_2018 () valeurs () ''Je suis surpris que vous ne soyez pas . obtenir une erreur d'exécution de la base de données sur cette –

Répondre

0

stocker les données UTF-8 dans un UTF8String au lieu d'un String standard, puis appeler soit UTF8Decode() ou Utf8ToAnsi() et stocker qui donnent lieu à la base de données.

+0

salut, mon cher Remy, je vous remercie de votre réponse, qui est utile tempstring: = copie (s, 12,50); tempstring:. = UTF8Decode (tempstring); . quInsert.Parameters.ParamByName ('veh_type_cn') valeur: = tempstring; la deuxième ligne temstring montrent le "texte chinois" excatly et quand dans la troisième ligne, quInsert.Parameters.ParamByName ('véh _type_cn '). value a toujours le texte étrange, pourriez-vous savoir pourquoi? – kaihong

+0

'UTF8Decode()' renvoie un UTF-16 'WideString'. Ne l'affectez pas à votre 'tempString' (qui est clairement un' (Ansi/UTF8) String'), qui effectuera une conversion UTF16-> Ansi indésirable. Assignez le 'WideString' directement au' Value' et laissez la base de données gérer toutes les conversions dont il a besoin, par exemple: 'quInsert.Parameters.ParamByName ('v_type_cn'). Value: = UTF8Decode (copy (s, 12,50)); '(BTW, dans votre question, vous appelez' UTF8Encode() 'à la place de' UTF8Decode() '. Ne doublez pas les données UTF!) –

+0

https://i.stack.imgur.com/oP3l3.png Salut Remy, pourriez-vous aider à voir cette image, semble que la valeur est toujours '?' – kaihong