说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在DELPHI中使用ADO对象存取ODBC数据库

HTML文档下载 WORD文档下载 PDF文档下载
在DELPHI中使用ADO对象存取ODBC数据库

作为一个ASP爱好者,笔者经常在ASP页面中使用ADO对象操作ODBC数据库,觉得用ASP创建WEB应用系统确定挺方便的.虽然在编程生涯中,笔者更喜欢Borland系列产品,对微软产品有点排斥,对ASP却是例外.某天,灵机一动,ADO对象是一个标准OLE对象,如果在DELPHI应用程序中能利用ADO操作数据库,应该挺不错.尤其在用DELPHI做网络数据库应用程序时,如果所在的WEB站点是WINNT站点并且支持ASP页面,就可以用ADO对象访问ODBC数据库,而不用把那么大的BDE再上载到站点上去,这样就可充分利用DELPHI和ASP的编程优势,做出更好的ISAPI/NSAPI/CGI.

经过编程和测试,在DELPHI中可以成功地用ADO对象存取ODBC数据库,现将使用经验写出来,与大家共享,让我们多一个访问ODBC数据库的方法.

在32位的DELPHI中,可以声明一个variant变量(如AVariant),然后通过CreateOleObject 创建一个OLE对象,如AVariant:=CreateOleObject('ADODB.Connection')可以获得一个数据库连接对象的实例,然后就可以利用该对象的方法和属性来操作ODBC数据库了.

下面简单介绍一下访问ODBC数据库所用到的ADO对象及其方法和属性.

1.数据库连接对象(ADODB.Connection)

该对象用于与ODBC数据库建立连接,所有对数据库的操作均通过该连接进行.

数据库连接对象ADODB.Connection的作用象Delphi中的TDatabase对象.

建立一个连接对象的方法为(AConnection为Variant类型变量):

AConnection:=CreateOleObject('ADODB.Connection')

用于建立连接的方法为Open,使用语法为(以对象AConnection为例):

AConnection.Open( ConnectionString

UserId

Password )

三个参数均为字符串类型,其中UserId和Password为用户名称和用户密码,用来访问。

数据库时使用,可以省略,因为在ConnectionString同样可以指定用户名称和用户 密码.ConnectionString是用来说明ODBC数据源信息的字符串,其格式为:

'Provider=ProviderName;DSN=DSNName;

DRIVER=driver; SERVER=server;

DATABASE=database;

UID=user; PWD=password'

其中:

Provider:数据提供者,默认为MSDASQL,为微软OLEDB,通常省略

DSN :要打开的数据库对应的OBDC系统数据源(DSN),是可选参数

DRIVER :要打开的数据库所用的驱动程序名称,如Access对应

Microsoft Access Driver(*.mdb),是可选参数

SERVER:要打开的数据库所在的服务器名称,本机可用(local),是可选参数

DATABASE:要打开的数据库名称,是可选参数

UID :用户名称,用来访问数据库,是可选参数

PWD :用户密码,用来访问数据库,是可选参数

以上参数均为可选参数,但必须提供足够的信息来描述一个系统数据源。

假如已经定义了一个ODBC的系统DSN,名称为MyDsn,那么就可用以下语句建立一个数据库连接:

AConnection.Open('DSN=MyDsn');

为了防止DSN不存在或其设置被他人修改时造成应用程序运行错误,可以用ADODB.Connection创建一个临时ODBC数据源,这样可以保证我们使用的系统DSN的参数设置是正确的.下面的语句可以创建一个临时ODBC系统DSN,对应一个ACCESS数据库,路径为

C:\Inetpub\wwwroot\test.mdb

AConnection.open('Driver={MicrosoftAccess Driver (*.mdb)};DBQ=

C:\inetpub\wwwroot\test.mdb')

建立一个ADODB.Connection后,如果不需要返回操作结果(如删除,修改,更新等操作)就可以对数据库进行正常的SQL操作了,此时应用ADODB.Connection的另外一个方法Execute,使用语法为:

AConnection.Execute( strSQL );

其中strSQL为执行操作的SQL语句,如删除操作可以为:delete from wfjcommu 用AConnection.Close关闭一个数据库连接.

2.数据集对象(ADODB.RecordSet)

如果要执行查询操作并返回查询结果,或者要更方便地操作数据表,就需要用到数据集对象了.

数据集对象ADODB.RecordSet的作用象Delphi中的TTable或TQuery对象.

建立一个数据集对象的方法为(ARecordSet为Variant类型变量):

ARecordSet:=CreateOleObject('ADODB.RecordSet')

从数据表取得数据的方法为Open方法,具体使用方法为:

ARecordSet.Open( strCommand

ActiveConnection

intCursorType

intLockType

intCommandType );

其中: strCommand:字符串,为命令参数,可以是一个Table名称,可以是一个SQL语句,也可以是一个服务器上的存储过程(StoredProc)名称,具体需要后面的参数intCommandType来指定.

ActiveConnection:要使用的数据库连接,是一个ADODB.Connection对象.

intCursorType:长整数,数据集的Cursor类型,可选参数,请参见程序中注释。

intLockType:长整数,对数据表的加锁类型,可选参数,请参见程序中注释。

intCommandType:长整数,命令参数的类型,用来指明strCommand的作用,可以指定strCommand为命令(如SQL语句)或数据表(TTable)或储存过程(StoredProc),可选参数,请参见程序中注释。

如执行一个SQL查询,可以采用如下语句:

ARecordSet.Open('Select * from wfjcommu'

adOpenStatic

adLockOptimistic

adCmdText);

其它常见属性和方法与TTable和TQuery相比较如下(具体请见ASP帮助文件):

eof

bof:eof

bof.

MoveFirst

MoveLast:First

Last

MovePrevious

MoveNext:Prior

Next

Move:MoveBy

AddNew:append

Update:Post

Close:close

Delete加Update:delete,所有对数据表的修改均须用Update使操作有效,这与Delphi不同。

Fields[FieldNo]:Fields[FieldNo]

Fields['FieldName']:FieldByName('FieldName')

3.其它常见对象(与Delphi对应的对象):

ADODB.Field:TField ADODB.Parameter:

TPara ADODB.Error:EDBEngineError

ADODB.Command:无 ADODB.Property:无

下面来看一个应用例子,听别人说总不如自己看实际的例子来体会。在这个例子中,将演示如何利用ADO对象来对一个数据表进行查询、增加记录、修改记录和删除记录操作。具体的用法请参见程序中的注释,如果有点Delphi数据库编程经验,相信不难理解。

在我们的例子使用的数据库为Test.MDB,其中有一个数据表为wfjcommu,有五个字段AName、Portable、Tel、BP、PostAddress,分别表示姓名、手机号、电话号码、呼机号码和通信地址。

procedure TForm1.Button1Click(Sender: TObject);

{*****************************************************

用ADO操作ODBC数据库本程序中,将创建一个临时的ODBC系统数据源,指向一个MsAccess数据库,然后对其中的数据表进行显示、增加、修改、删除和查询操作注意:请在Uses语句中包含ComObj单元

*****************************************************}

const{ 一些常量声明,详细请参见adovbs.inc }

{ ---- CommandType的常量说明 ---- }

adCmdUnknown = 0008;//未知

需要系统来判断

速度慢

为缺省值

adCmdText = 0001;//命令语句如SQL语句

adCmdTable = 0002;//数据表名称

adCmdStoredProc = 0004;//存储过程名称

{ ---- CursorType的常量说明 ---- }

adOpenForwardOnly = 0;//只能由前向后单向访问

为缺省值

adOpenKeyset = 1;//可见其他用户对数据的修改

但对其它用户的增加和删除不可见

adOpenDynamic = 2;//其他用户对数据的增加修改和删除均可见

adOpenStatic = 3;//其他用户对数据的增加修改和删除均不可见

{---- LockType的常量说明 ---}

adLockReadOnly = 1;//只读

为缺省值

adLockPessimistic = 2;//在修改时

按单个记录锁定

adLockOptimistic = 3;//在修改后更新时

按单个记录锁定

adLockBatchOptimistic = 4;//在成批更新时记录锁定

var

AConnection

ARecordSet : variant;

longintTemp : integer;

strTemp : string;

intIndex : integer;

begin

{创建一个临时的ODBC数据源

指向一个MsAccess数据库

并利用此DSN建立一个数据库连接}

AConnection := CreateOleObject('ADODB.Connection');

AConnection.Open('Driver={Microsoft Access Driver

(*.mdb)};DBQ=C:\inetpub\wwwroot\test');

{建立一个数据集对象

并从数据表中提取数据}

ARecordSet := CreateOleObject('ADODB.RecordSet');

ARecordSet.open( 'wfjcommu'

AConnection

adOpenStatic

adLockOptimistic

adCmdTable );

memo1.lines.clear;

memo1.lines.add('********数据表原有的内容如下********');

{显示各个域的域名}

strTemp := '';

for intIndex := 0 to ARecordSet.Fields.count - 1 do

strTemp := strTemp + ARecordSet.Fields[intIndex].name+';';

memo1.lines.add( strTemp );

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to ARecordSet.Fields.count - 1 do

strTemp := strTemp + ARecordSet.Fields

[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

{增加一个记录}

ARecordSet.AddNew;//增加

Append

ARecordSet.Fields['AName'] := '1';

//以FieldByName的方式存取

ARecordSet.Fields['Portable'] := '2';

ARecordSet.Fields(2) := '3';

//以Fields[index]的方式存取

ARecordSet.Fields(3) := '4';

ARecordSet.Fields(4) := '5';

ARecordSet.Update;//更新,Post

ARecordSet.MoveFirst;//移到首条,First

memo1.lines.add('********增加了一条

记录后的数据表的内容如下********');

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to ARecordSet.

Fields.count - 1 do

strTemp := strTemp +

ARecordSet.Fields[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

{修改最后一条记录}

ARecordSet.MoveLast;

ARecordSet.Fields['AName'] := '11';

//以FieldByName的方式存取

ARecordSet.Fields['Portable'] := '22';

ARecordSet.Fields(2) := '33';

//以Fields[index]的方式存取

ARecordSet.Fields(3) := '44';

ARecordSet.Fields(4) := '55';

ARecordSet.Update;//更新,Post

ARecordSet.MoveFirst;//移到首条,First

memo1.lines.add('********修改了最后一条

记录后的数据表的内容如下********');

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to

ARecordSet.Fields.count - 1 do

strTemp := strTemp +

ARecordSet.Fields[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

{删除最后一条记录}

ARecordSet.MoveLast;//移到末条,Last

ARecordSet.delete;//删除,delete

ARecordSet.Update;//更新,在Delphi不需要

ARecordSet.MoveFirst;//移到首条,First

memo1.lines.add('********删除了最后一条

记录后的数据表的内容如下********');

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to ARecordSet.Fields.count - 1 do

strTemp := strTemp + ARecordSet.

Fields[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

ARecordSet.Close;{关闭数据集}

{用SQL语句进行查询

查询姓名为“张三”的记录}

{注意,在SQL语句中,字符串应该用单引号包括起来}

ARecordSet.open( 'select * from wfjcommu

where AName = ''张三'''

AConnection

adOpenStatic

adLockOptimistic

adCmdText );

memo1.lines.add('********张三的内容如下********');

memo1.lines.add( '共有' + IntToStr

( ARecordSet.RecordCount ) + '条匹配的记录' );

{显示各个域的内容}

while not ARecordSet.eof do

begin

strTemp := '';

for intIndex := 0 to ARecordSet.Fields.count - 1 do

strTemp := strTemp + ARecordSet.Fields

[intIndex].value+';';

memo1.lines.add( strTemp );

ARecordSet.MoveNext;//移到下条,Next

end;

{关闭数据集和数据库连接}

ARecordSet.close;

AConnection.close;

end;

以上程序在PWIN98+DELPHI3.0+PWS(Personal Web Server)4.0下调试通过.

关于ADO对象的详细资料,请参见ASP帮助文件或Interdev帮助文件或OFFICE2000的有关文档。

喜讯:中国安全团队Keen成功在Pwn2Own 2014黑客大赛上攻破64位Mac上的Safari OCP黑客马拉松冠军:24小时头脑风暴背后 新时代应用程序设计及MongoDB的十个深入理解 借助“开源”东风 英特尔打造卓越“软实力” 深圳综合交通设计研究院张鹍鹏:智能交通设备领域已成红海 信息化是发展趋势 25个可遇不可求的jQuery插件 Web设计中对视差设计的误区 直接拿来用,九个超实用的PHP代码片段(二) 一周消息树:小米染指平板电脑凶多吉少 移动周报:Xcode 5.1更新、CarPlay揭秘,Apple很忙 可穿戴领域,创业公司的掘金点?还是滑铁卢? 搜狐SendCloud2014运维技术沙龙拉开帷幕 一周热点:选择Go语言的12个理由,九头蛇与大象之争 中国云计算大会PPT集萃(二):十位技术大牛分享平台打造技术 延迟250毫秒损失数百万美元,Hadoop系统该如何应对实时任务 IBM成立展示中心扩展大型主机的Linux开放生态系统 SDN解决方案总结:OpenFlow、虚拟机、OpenStack和VXLAN/NVGRE 第六届中国云计算大会将于5月20-23日在京隆重召开 大数据实战:站在JMP分析平台上的FIT足迹识别技术 首届SAP d-code大会在上海举办 【OSTC讲师专访】ZoomQuiet:因商业化而开源是中国开源界最大的囧处 亿元资金扶持+联手100家VC,腾讯的雄心壮志 美国史上最大IPO 能给阿里巴巴带来什么? 买Windows平板而非iPad或Android的十大理由 Framework7:不会Objective-C,也能开发iOS7应用 CocoaChina开发者大会 全新引擎Cocos 3d-x开源 Oracle和微软的抱团,以及对抗Amazon霸主的5个可用点 Agile已死 Agility长存? 论程序员的自我修炼 Github女员工因遭性别歧视离职 继七年iPhone、四年iPad后,苹果的下一城:Healthbook 怎样把金钱变量转换成字符串变量? 有人知道如何在application中取出拨号地址的吗? 这不公平!!!!!!! Delphi 指针问题,请大家帮忙! web assistant怎么根据数据库中的数据生成一个页面?那个页面要我自己的样式? 大家帮我看看错在那里!谢谢! 请问有没有用自己的机子作服务器的? 帮我看看代码 日志钩子的安装问题? 如何使用。MDB文件 由于上一题回帖子的人数众多,导致分数不够,所以再开一帖!继续!关于用vb进行文件的读写问题! 怎样在数据库中输入了许多条记录后, 一次性存盘成功? 改变光驱盘符?很急很急 在Oracle中怎样加已经存在的数据文件? 我想请高手帮忙 !! 请问目前那一本参考书对DELPHI初学者有很大提高? 一个关于udp重发的问题 如何在delphi程序里调用vc写的exe执行文件。 如何将query中的内容输出到文本文件,然后还能将该文本文件再导入进来?急急急!!!!!!!!!!! 急急急!!我的计算机找不到硬盘了45分 如何求任意多边形的重心 紧急求助:请问java有没有比较丰富的多媒体控件?比如录音的控件??? 急急急!!!我的计算机找不到硬盘了,45分 如何把一个字段的内容求和,然后把结果存入另一表! 请教,怎样把一个记录数组用VB读入ACCESS 2000数据库中? 关于货币类型的问题? the script too large ????????我快疯了。 什么地方有Sybase与Oracle的比较资料? 急急急!!!我的计算机找不到硬盘了,40分 问一下大家 复活节彩蛋 win2000 professional下如何配置weblogic6.0 jsp和javasript如何通讯? 急!!!如何把'¥100'字串转化为浮点型100.00 用OleContainer1将一个WORD文档存进数据库后如何将它从数据库中取出??? 关于SNMP的问题(请高手回答,送40分) 谁想过要戒水?戒成了吗?又渴了吗? 我用在各种机器上使用Win2000,从来没有down过, 真是太奇怪了??? 请问如何确定操作系统系统是中文的还是英文的? 向外国用户发注册码时候应该说些什么,才能让别人觉得你比较专业? 如何捕获ADO的异常信息 struct结构的数据存储是用的什么顺序方式呀? 能介绍几本关于BCB的适合初学者阅读的书吗? 高手进来,struct结构的数据存储是用的什么方式呀 高分!高手请进!!! Newton 有关StoredProc的 各位大虾进来看看,Debug时的错误~~~~~~~ First-chance exception 和 User breakpoint ,帮帮我啊!!! 虽然我也回复没有分,但有意思的帖子,但我对分数高的帖子更有热情,我是不是很势利?? 我的服务器是unix 哪位提供最简单的图片存入库中的代码 英语有哪些标点符号 英语翻译我想写一封信给Daniel,不过我的英语不行,请帮我翻译一些句子,请不要发在线翻译的结果给我,1 哈利波特系列是我最喜欢的书之一.读书的时候我的思绪在奇妙的魔法世界游走,但在看 联想笔记本键盘字母变数字? 英文里为什么很少用标点符号?印象中括号,引号,破折号都很少见,书名号更是根本没有,常用的只有逗号句号和问号,偶尔能看到个引号.这是为啥捏?3Q 英语翻译新年期间收到叔叔的一封邮件,内容是:叔叔们准备寄700美元回家乡给我们过新年,但是到目前为止,我们并没有收到关于这700美元的任何信息!在发这封邮件之前,我已经发过两封邮件 下面的字母各代表什么数字?(不同字母代表不同数字.)a 0 b c 3 - x 7 2 y =7 7 7a=?b=?c=?x=?y=? 英语翻译英文句子里电影名字是用《》书名号括上,还是用“”引号括上? 英语翻译Hello,My name is Loyce Agurma,I came acrose your profile hi.baidu.com I felt it and decide to send you a massage,to ask you for friendship .you know having a prophesy of love over someone there most be odds around the,but no matter the od 下面算是中相同的字母代表相同的数字,不同的字母代表不同的数字.每个字母各表示什么数字? 填写标点符号, 如何写英文祝贺信 手机ID号是按哪些数字和字母啊? 标点符号填写1雨的力量在于它可使一望无际的黄土高原转眼变得沟沟壑壑()混乱不堪()而知识的力量则在于它可改变命运()扭转乾坤(),缔造美好的未来.2不要在光线暗的地方看书( 这封信怎么写?英语Contact person是 Julie Murphy,公寓名字是Medical Center Apartments.它有三种,1 bedroom,2 bedroom和3 bedroom,我想选这个3 bedroom,住6个人最划算的这个. Photoshop选颜色画面的下面前面带#号的选项 ,有是全是数字有时全是字母有时是数字字母组合那个选项是做什么的? 填写标点符号 字母找规律1、BEH,ELM,LN( )2、CFL,FKP,KR( )3、KFP( ).DML( ) 4、ELN( ).ADG( ) 沪牌照沪+字母 字母+四位数字的号码和沪+字母 +全数字的有什么差别?现在上海的私车牌照有的是比方:沪D H1234,有的是沪D 12345 这两种牌照有什么差别? 问一个标点符号书写问题如果用格子信纸书写到每一行还有一个空格时,这时正好这句话还差一个字,如果加上句末的标点符号就需要两个空格了.通常遇见这种情况下是不是这最后一个空格就 英语字母找规律A,S,D,F,G,H,J_,_.请问该填什麽?规律是什麽? 数字30~40用英语怎么写?35~40的就可以了~ 名信片的英语怎么写 看字母 找规律ABAABAAABAAAABAAAAABAAAAAAB.按以上的规律,那么前2005有几个B 英语数字1-30 英语比赛,要写一篇英语作文,布置怎么写英语信. 我想给字母找规律根据提示写字母A D G D I N I P ( ) 用括号内所给单词的适当形式填空.1、If my bank manager ______(lend) me the money,I______(buy) a new car next month.2、I______(have)to go to see the doctor tomorrow.3、If you bring friends from other schools,the teacher ____(ask) them "英文怎么写?你...以上英文怎么写? 找规律填字母.(1)K F P () (2)E I N () A D G ()D M I ()(1)K F P ( ) (2)E I N ( ) D M I ( ) A D G ( ) 用括号中所给的动词的适当形式填空(英语)My grandfather___(go)to the park every morning.They are____(have)a lesson now.The teacher is_____(stand)in front of the blackboard.He____(paint)his desk black last week.I______(此处填 英语信怎么写 During the summer holiday there will be a new schedule.C 1 for meal and l 2 service hours and for bus schedules will appear on the wall outside the dining room.We are making weekly film and concert schedules.They will a 3 each Wednesday outside the l 谁能帮我做一下这几道英语题 (用括号内所给的适当形式填空)1 ) How many * (time) did he orbit the Earth?2)The plane landed * (safe)in shanghai.3)The boy * (bear)in 1993.4)Jack and I * (be) late for school yesterday.5)T 《信我 》的英文怎么写 潮州话数字1-10和26个英文字母怎么读?和普通话发音不同的请注明读音,0,2,5,10怎么读?用汉字表示出来好吗? 用括号中所给词的正确形式填空①Which month is the_____(nine)month?②______(sixty-two)students are in our class.③May 10th is her brother's______(thirty)birthday.④Mr Wu is on______(twelve)floor of the building.⑤Tom is_______(thre 我喜欢你 你信么英语 (英语题)根据首字母填空(10题)1.Monica h_____ three books and apencil case.2.Do you h_____ a baseball bat?3.Let's p_____ soccer.4.That's _____ interesting.5.I don't w_____ TV in the evening.6.How do you s_____ pencils?7.There are so 英语题目用括号内所给的正确形式填空that sign means “no【 】【litter】there are a lot of【 】【photo】on the deskare they【 】【make】model planes now?the old man often【 】【touch】the tree thereplease come here【 我说我喜欢你,你信不?英文怎么翻译 英语首字母填空 急! 所有空都得填出来(数清了,是10个空)"Be careful" is used very often in China to show care f______ others. But in Britain it sounds like giving an order or w_______. You could say that to younger people but n_____ 用括号中所给的单词的适当形式填空(英语)Today she____(like)basketball,but she_____(enjoy)playing volleyball in five years. 谁能帮我写英文信信的大致内容是:我叫XXX 我是那个中国孩子 很高兴能与您相识 并且成为一个临时家庭 我的英文不是太好 我想您已经了解 很抱歉我迟来的问候 请带我向您的家人问好还有 见信速回用英语怎么写 衣服码号有数字的,有英文字母的,到底多大的号对多大的码? 一份写给父母的英文信内容是我在大学中生活个方面的增加了,而且物价也在涨,等原因.希望你的父母能给你增加生活费. 他在信中写了什么吗 用英语怎么说 用户名由6-20位长度的数字,英文字母和标点符号组成,至... 中文标点和英文标点转换有没有快捷键转换中文标点和英文标点?而不用再去输入法图标上点击. 昨晚我写了一封信(求英语翻译) ORACLE SQL 获取26个大写英文字母A-Z形如:字母ABCD……Z不用union的方式 输入的中文标点符号与英文标点符号有什么区别?中文标点符号与英文标点符号主要是什么功用. 英语信怎么写啊 caxa如何将标注中的数字尺寸换成英文字母?我选编辑-文字内容,经常改不了,还是数字而不是字母,为什么? 怎样切换中文标点和英文标点? ( )the( )( )English?翻译:这封信是用英语写的吗? 笔记本键盘上的英文字母为什么会变成数字?有时候玩着玩着这些英文字母J I O L M U 都会变成数字 一些数字34560 就会按出来是#¥%……这样子为什么会这样?打问号还会变成+ 为什么 笔记本上 关于英文里的标点符号今天上课就是讲这个..听不太懂....不是句号实不实心的问题...是想问在句子中分段的用法.. 英语翻译MIKE JASON先生您好:在北京的机械展览会上,有幸认识您十分的高兴.我公司是经营脚轮,履带板翻新等项目.希望能与贵公司合作.下面是我公司的联系方式天津XX脚轮厂地址:天津市河东区 华硕笔记本键盘的字母变数字了,怎么回事我按键盘的u i o j k l m 是数字 4 5 6 1 2 3 0 请问下是怎么回事啊?怎么才恢复得过来呢?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn