ข้อผิดพลาดที่เก็บ unicode ใน delphi7 หรือไม่?
เมื่อเร็ว ๆ นี้เมื่อใช้ Delphi7 เพื่อทำโปรแกรม Unicode ฉันค้นพบปัญหาดังกล่าวนั่นคือเมื่อใช้ส่วนประกอบ Tadocommand เพื่อเรียกใช้คำสั่ง SQL หากมีอักขระ Unicode ในคำสั่ง SQL รหัสที่อ่านไม่ออกจะปรากฏในฐานข้อมูล จริงสำหรับการใช้ ttntadoquery (การใช้พารามิเตอร์ไม่ได้มีรหัสที่อ่านไม่ออกและที่นี่เราจะหารือเฉพาะวิธี SQL บริสุทธิ์) อย่างไรก็ตาม Tadocommand สนับสนุนตัวเองกว้างและคุณสมบัติ CommandText ยังเป็นประเภทที่กว้างที่สุด ฉันพยายามเปลี่ยนค่าแอตทริบิวต์หลายอย่างของ Tadocommand และพบปรากฏการณ์แปลก ๆ ทำไมสิ่งนี้ถึงเกิดขึ้น? คุณสมบัตินี้ดูเหมือนจะไม่มีส่วนเกี่ยวข้องกับ Unicode เอง โดยการศึกษาไฟล์ AdoDB.pas ที่ตั้งอยู่ที่ Tadocommand ฉันพบปัญหา
ขั้นตอน TADOCOMMAND.ASSIGNCOMMANDTEXT (ค่า const: WIDESTRING; การโหลด: บูลีน);
ขั้นตอนการเริ่มต้นพารามิเตอร์;
วาจา
ฉัน: จำนวนเต็ม;
รายการ: tparameters;
NativeCommand: String;
เริ่ม
รายการ: = tparameters.create (ตัวเอง, tparameter);
พยายาม
NativeCommand: = list.parsesql (ค่า, จริง);
{รักษาค่าที่มีอยู่}
list.assignvalues (พารามิเตอร์);
CommandObject.CommandText: = nativeCommand;
หากไม่โหลดและ (กำหนด (การเชื่อมต่อ) หรือ (ConnectionString <> '')) แล้ว
เริ่ม
พยายาม
SetConnectionFlag (CFParameters, TRUE);
พยายาม
{ดึงข้อมูลพารามิเตอร์เพิ่มเติมจากเซิร์ฟเวอร์หากรองรับ}
พารามิเตอร์ internalrefresh;
{ใช้ข้อมูลพารามิเตอร์เพิ่มเติมจากเซิร์ฟเวอร์เพื่อเริ่มต้นรายการของเรา}
ถ้าพารามิเตอร์. count = list.count แล้ว
สำหรับ i: = 0 ถึง list.count - 1 ทำ
เริ่ม
รายการ [i] .datatype: = พารามิเตอร์ [i] .datatype;
รายการ [i] .size: = พารามิเตอร์ [i] .size;
รายการ [i] .numericscale: = พารามิเตอร์ [i] .numericscale;
รายการ [i]. ความไม่แน่นอน: = พารามิเตอร์ [i]. ความแม่นยำ;
รายการ [i] .direction: = พารามิเตอร์ [i] .direction;
รายการ [i] .attributes: = พารามิเตอร์ [i] .attributes;
จบ
ในที่สุด
SetConnectionFlag (CFParameters, FALSE);
จบ;
ยกเว้น
{ละเว้นข้อผิดพลาดหากเซิร์ฟเวอร์ไม่สามารถให้ข้อมูลพารามิเตอร์}
จบ;
ถ้า list.count> 0 แล้ว
parameters.assign (รายการ);
จบ;
ในที่สุด
list.free;
จบ;
จบ;
เริ่ม
if (commandType = cmdText) และ (value <> '') และ paramCheck แล้ว
ผู้เริ่มต้น
อื่น
เริ่ม
CommandObject.CommandText: = ค่า;
ถ้าไม่โหลดพารามิเตอร์ clear;
จบ;
จบ;
ดูคำสั่งนี้:
if (commandType = cmdText) และ (value <> '') และ paramCheck แล้ว
ผู้เริ่มต้น
นั่นคือเมื่อ Paramcheck เป็นจริงกระบวนการเริ่มต้นจะถูกดำเนินการ
ครั้งแรกมันกำหนดตัวแปร: NativeCommand: String;
NativeCommand: = list.parsesql (ค่า, จริง);
{รักษาค่าที่มีอยู่}
list.assignvalues (พารามิเตอร์);
CommandObject.CommandText: = nativeCommand;
ที่นี่ค่าเป็นประเภทที่กว้างที่สุดและ list.parsesql ส่งคืนประเภทสตริงและ NativeCommand เป็นประเภทสตริง ซึ่งทำให้ CommandObject.CommandText ไม่ได้รับค่าที่กว้างที่สุดที่ควรกำหนดให้กับมันซึ่งในที่สุดก็นำไปสู่การเกิดขึ้นของรหัสที่อ่านไม่ออกเมื่อเก็บ unicode
การแก้ปัญหานั้นง่ายมาก (หากคุณไม่เต็มใจที่จะแก้ไขโปรแกรม Delphi Source) คุณเพียงแค่ตั้งค่า Paramcheck เป็น False (Delphi ค่าเริ่มต้นเป็น Paramcheck เป็น TRUE)