delphi写xml文件的汉字数据到sql数据库中变乱码

Lstevev 2008-12-10 08:37:10
把数据写到memo中可以正常显示,但写入数据库变成几个问号了. .xml文件内容:
<?xml version="1.0" ?>
<ROWDATA>

<ROW>
<SHBZM>350420501225003</SHBZM>
<JFNY>200712</JFNY>
<JFDWM>58220000904</JFDWM>
<XM>黄仁国</XM> //这是一个姓名可以正常显示在Memo中.
<BQJFYS>12</BQJFYS>
<BQJFGZJS>7450</BQJFGZJS>
<BJLNYS>0</BJLNYS>
<BJLNGZJS>0</BJLNGZJS>
<YDZRYS>0</YDZRYS>
<YDZRJE>0</YDZRJE>
</ROW>

代码:
try
MonitorMsg('开始处理');
ActiveX.CoInitialize(nil);
DM.ADOConn.Connected := true;
Main.Form1.xmldocument1.LoadFromFile(Main.Form1.Edit1.text);
root := Main.Form1.xmldocument1.DocumentElement;
lei := root.ChildNodes.First;

SQL := 'insert into %s.DBO.%s values';
SQLstr := Format(SQL, [Main.Form1.ComboBox1.Text, Main.Form1.combobox3.Text]);

case Main.Form1.ComboBox3.ItemIndex of
0: SQLstr := SQLstr + T_QZSBJFFJ_valu;

1: SQLstr := SQLstr + T_QZSBJFF_valu;

2: SQLstr := SQLstr + T_QZSBGRZH_valu;
end;

MonitorMsg('共有'+IntToStr(lei.ChildNodes.Count)+'列数据.');
while lei <> nil do
begin
if lei.NodeName = 'ROW' then
begin
if lei.ChildNodes.First <> nil then
begin
for I := 0 to lei.ChildNodes.Count - 1 do
begin
Dt := FormatDateTime('YYYY-MM-DD HH:MM:SS', Now);
MonitorMsg(Dt +' 读取数据: '+ lei.ChildNodes.Get(I).NodeValue); //写到Memo正常显示
end;

case Main.Form1.ComboBox3.ItemIndex of
0:SQLSRC := format(SQLstr,
[lei.ChildNodes.Get(0).NodeValue,
lei.ChildNodes.Get(1).NodeValue,
lei.ChildNodes.Get(2).NodeValue,
lei.ChildNodes.Get(3).NodeValue,
StrToInt(lei.ChildNodes.Get(4).NodeValue),
StrToFloat(lei.ChildNodes.Get(5).NodeValue),
StrToInt(lei.ChildNodes.Get(6).NodeValue),
StrToFloat(lei.ChildNodes.Get(7).NodeValue),
StrToInt(lei.ChildNodes.Get(8).NodeValue),
StrToFloat(lei.ChildNodes.Get(9).NodeValue)]);
1:SQLSRC := format(SQLstr,
[lei.ChildNodes.Get(0).NodeValue,
lei.ChildNodes.Get(1).NodeValue,
lei.ChildNodes.Get(2).NodeValue,
StrToFloat(lei.ChildNodes.Get(3).NodeValue),
StrToFloat(lei.ChildNodes.Get(4).NodeValue),
StrToFloat(lei.ChildNodes.Get(5).NodeValue),
StrToFloat(lei.ChildNodes.Get(6).NodeValue)]);
2:SQLSRC := format(SQLstr,
[lei.ChildNodes.Get(0).NodeValue,
lei.ChildNodes.Get(1).NodeValue,
lei.ChildNodes.Get(2).NodeValue,
StrToInt(lei.ChildNodes.Get(3).NodeValue),
StrToFloat(lei.ChildNodes.Get(4).NodeValue),
StrToInt(lei.ChildNodes.Get(5).NodeValue),
StrToFloat(lei.ChildNodes.Get(6).NodeValue),
StrToFloat(lei.ChildNodes.Get(7).NodeValue),
StrToFloat(lei.ChildNodes.Get(8).NodeValue),
StrToFloat(lei.ChildNodes.Get(9).NodeValue),
StrToInt(lei.ChildNodes.Get(10).NodeValue),
StrToFloat(lei.ChildNodes.Get(11).NodeValue),
StrToFloat(lei.ChildNodes.Get(12).NodeValue),
StrToInt(lei.ChildNodes.Get(13).NodeValue),
StrToFloat(lei.ChildNodes.Get(14).NodeValue),
StrToInt(lei.ChildNodes.Get(15).NodeValue),
StrToFloat(lei.ChildNodes.Get(16).NodeValue),
StrToFloat(lei.ChildNodes.Get(17).NodeValue)]);
end;
MonitorMsg(Dt +' 正在写入数据库: '+ SQLSRC);
ExecSQL(SQLSRC, Dm.ADOQ1);
end;
lei := lei.NextSibling;
end;
end;

...全文
232 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuihan20e 2008-12-11
  • 打赏
  • 举报
回复
你的处理方法看起来怎么这么繁琐,我这样写的,不知道对你有没有帮助


<?xml version="1.0" encoding="GB2312" ?>
<root>
<Dep>
<ID>1</ID>
<Dep>技术支持</Dep>
<ID>2</ID>
<Dep>开发部</Dep>
<ID>3</ID>
<Dep>客服部</Dep>
</Dep>
</root>



procedure DealXml(strFileName:string);
var
//根结点和一级子结点
node,subnode :IXMLNode;
//一级和二级子结点列表
nodelist,subnodelist: IXMLNodeList;
//一级和二级子结点的数目
subCount,subsubCount: integer;
j, k:integer;
//记录条数
RecCount: Integer;
//插入数据库的SQL语句
insertSql: string;
errstr: string;
begin
XMLDoc.LoadFromFile(strFileName);
XMLDoc.Active := true;
//根结点
node := XMLDoc.DocumentElement;
//如果只有根结点的子结点数量不对,说明文件不对
subCount := node.ChildNodes.Count;
//需要下载的文件数量是3个,不需要下载的在xml中没有节点
if subCount<>4 then
begin
WriteLog('下载的xml文件不正确');
exit;
end;
nodelist := node.ChildNodes;
subnode := nodelist.Nodes[0];
subsubcount := subnode.ChildNodes.Count;
//dep
if subsubcount > 0 then //如果有记录,就更新到数据库
begin
with frmMain.qry do
begin
sql.clear;
sql.add('DELETE FROM Dep');
ExecSQL;
end;
recCount := subsubcount div 2;
subnodelist := subnode.ChildNodes;
k := 0;
for j:=0 to recCount-1 do
begin
insertSql := 'INSERT INTO Dep(ID, Dep) VALUES ( ';
insertSql := insertSql + subnodelist.Nodes[k].Text + ',';
k := k+1;
insertSql := insertSql +'"'+subnodelist.Nodes[k].Text+'"' + ')';
k:=k+1;
with frmMain.qry do begin
sql.Clear;
sql.add(insertsql);
//ShowMessage(insertSql);
ExecSQL;
end;
end;
end;
end;
lyguo 2008-12-11
  • 打赏
  • 举报
回复
cds_Share.LoadFromFile(ExtractFilePath(Application.ExeName) +
'Memo.xml');

先把它导入到数据集,然后再试下。
starluck 2008-12-11
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="gb2312"?>


看下你的ENCODING類型,GB2312,UTF-8 ===
Lstevev 2008-12-11
  • 打赏
  • 举报
回复
问题还没有解决....
weic 2008-12-11
  • 打赏
  • 举报
回复
估计是编码的问题。

具体说到解决的方法,楼主为什么不用XML Mapper+ClientDataSet呢?
又简单,又方便,也没有乱码之嫌。

我已经这样用过了,没问题。
Newredrose 2008-12-11
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="UTF-8"?>
ajmxj 2008-12-11
  • 打赏
  • 举报
回复
UTF8TOANSI用这个函数试试
tjg5202 2008-12-11
  • 打赏
  • 举报
回复
&转化成&
长沙三毛 2008-12-10
  • 打赏
  • 举报
回复
应该是编码的问题
liangpei2008 2008-12-10
  • 打赏
  • 举报
回复

<?xml version="1.0" encoding="gb2312"?>

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧