第七章数据库应用程序设计_第1页
第七章数据库应用程序设计_第2页
第七章数据库应用程序设计_第3页
第七章数据库应用程序设计_第4页
第七章数据库应用程序设计_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+Builder 程序设计教程第七章 数据库应用程序设计7.1 数据库应用程序的结构与设计方法 7.1.1 数据库应用程序的结构 7.1.2 数据库应用程序的设计步骤 初步设计 详细设计 信息处理:包括各类信息的编辑、查询、统计等 数据库管理:负责数据库的更新、修改等 系统维护:保证数据库应用程序运行的安全性和可靠性,一般包括用户管理,口令设置,各类系统变量和数据字典的维护等 辅助功能:系统安装程序、各种帮助系统和版本管理等 运行和维护 用C+Builder设计一个数据库应用程序(界面)的一般步骤:1.建立新工程/窗体2.设置数据集组件(通过DatabaseName属性与数据库建立连接) 3

2、.设置数据源组件(通过DataSet属性与数据集组件相联系) 4.设置数据控制组件(通过DataSource属性与数据源组件相联系) 5.设计事件驱动程序 7.2 数据控制组件 7.2.1 公共属性 DataSource属性 :用于选择数据源,使数据控制组件与数据表连接DataField属性 :选择要在组件中显示的字段 Enabled属性:当Enabled属性为true时,数据控制组件有效,此时组件可以进行编辑操作(1)ReadOnly属性:当ReadOnly属性为true时,数据只能读不可修改;当为false时,数据可读写。默认为false 7.2.2 TDBText组件 用来显示数据库表(

3、由DataSource属性设置)里当前记录中一个指定字段(由DataField属性设置)的值的数据控制组件。用TDBText组件显示的字段值是只读属性的,即用户不能通过这个组件来修改数据 TDBText组件显示的是当前记录中指定字段的值,所以随着记录指针的移动,其显示的内容也不断变化 AutoSize属性:当AutoSize为true时,组件能根据字段的内容自动调整长度,使其正好容纳字段的内容;为false 时,则字段内容超过长度的部分被截去 Transparent属性:当Transparent为true时,组件将以窗体背景为其背景色,否则以自身为背景色 7.2.3 TDBEdit组件 用来显

4、示和编辑数据库表里当前记录中一个指定字段的值的数据控制组件。用TDBText组件显示的字段值是只读属性的,而使用TDBEdit组件允许用户编辑修改数据。这也是它们之间惟一的区别 7.2.4 TDBGrid组件 将一个数据库表记录显示在网格中,并且可以对其中的数据进行编辑修改 在运行时,用户可以使用TDBNavigator在数据网格中移动记录指针,也可以插入、删除和编辑记录。编辑的结果在移动记录指针到另一条记录或者结束应用程序时提交给数据库保存 TDBGrid组件的主要属性 Columns属性:用来读取和设置网格中列的特性,如每列的标题、字体等。它可以在设计阶段由“Columns Editor”

5、对话框设定,也可以在应用程序运行时动态地设置 Fields属性:表示当前记录的一维数组,即Fields0、Fields1、Fields2Fieldsn-1分别代表当前记录的第1、2、3n个字段中的内容FieldCount属性:用来表示TDBGrid显示的字段数,运行时可用SelectedField属性:用于设置或返回当前选择的字段,如果当前没有选择,值为NULL SelectedIndex属性:用于设置或返回当前选择的字段在表中的索引值(即列号),索引值从0开始 DefaultDrawing属性:将DefaultDrawing属性设置为true时允许TDBGrid组件自动地在每一单元格中显示数

6、据;而将DefaultDrawing属性设置为false会取消自动显示 DragMode属性:使用DragMode属性来控制是否允许用户对数据网格单元进行拖放操作 Options属性:包含了一系列控制TDBGrid显示和编辑操作响应的选项,这些选项均为逻辑型 ReadOnly属性:用来标志网格是用来显示记录,还是允许用户通过它来编辑数据SelectedField属性:返回当前选中单元格的字段 TDBGrid组件的主要事件 事件 含义OnCellClick在单击网格中的单元格时触发OnColEnter当焦点移动到网格中的另一个单元格时触发OnColExit当一个单元格即将失去焦点时触发OnCol

7、umnMoved当网格中的一列发生移动时触发OnEditButtonClick在单击网格中一个字段的编辑按钮时触发OnTitleClick在单击网格中一个字段的标题时触发7.2.5 TDBNavigator组件 用来在数据库表中浏览和编辑数据的组件。它由一组控制按钮组成,通过这些控制按钮,用户可以在数据库表中移动记录指针,增添或删除一项记录,编辑修改数据记录以及向数据库提交对数据库表记录的修改等工作 TDBNavigator组件一般与其他数据控制组件(TDBGrid或TDBEdit)一起使用 TDBNavigator组件的按钮 图标名称功能First记录指针指向第一条记录Prior记录指针指向

8、上一条记录Next记录指针指向下一条记录Last记录指针指向最后一条记录Insert在当前记录前插入一条新记录Delete删除当前记录Edit编辑当前记录Post提交对当前记录的修改Cancel取消对当前记录的修改Refresh用数据库表中的新记录刷新显示缓冲区TDBNavigator组件的主要属性 ConfirmDelete属性:用来决定用户在删除记录时是否显示要求用户确认的消息框ShowHint与Hints:ShowHint属性决定是否显示TDBNavigator组件中各按钮的提示信息,Hints属性是用来设置按钮对应的提示信息VisibleButtons属性:用来确定TDBNavigat

9、or组件中需要显示哪些按钮Flat属性:与TSpeedButton组件的功能相同 TDBNavigator组件的主要事件 OnClick事件:在TDBNavigator组件的某个按钮被单击并执行完相应的操作之后触发 基本格式如下:void _fastcall TForm1:DBNavigator1Click(TObject *Sender, TNavigateBtn Button)其中Button参数的值为以下值之一:nbFirst、nbPrior、nbNext、nbLast、nbInsert、nbDelete、nbEdit、nbPost、nbCancel和nbRefresh,分别对应着DBN

10、avigator组件中的各按钮BeforeAction事件:发生在用户单击TDBNavigator组件的某个按钮,但相应的动作尚未执行前。Button参数的值表示用户按下的是哪个按钮。它的基本格式如下:void _fastcall TForm1:DBNavigator1BeforeAction(TObject *Sender,TNavigateBtn Button) 7.2.6 TDBMemo组件 用于显示和编辑数据表中大二进制(BLOB)类型(备注型)的字段值。该组件能允许用户编辑多行文本信息。允许编辑的文本信息最大字节数为32KB 主要属性 AutoDisplay属性:用来决定是否自动显示

11、一个数据库表中备注类型的字段值Alignment属性:用来设置在TDBMemo组件中显示文本时的对齐方式MaxLength属性:用来限定可以输入TDBMemo组件中的最大字符数WordWrap属性:是一个布尔值,用来指明向TDBMemo组件中输入的文本到了右边界处是否自动换行ScrollBar属性:说明TDBMemo组件是否显示滚动条 常用方法 :LoadMemo方法7.2.7 TDBImage组件 用来显示和编辑当前记录中的BLOB类型的图形字段。TDBImage组件除了可以在窗体中显示数据库表里的图形数据,还允许用户通过剪贴板对图形数据进行编辑操作主要属性 AutoDisplay属性:当A

12、utoDisplay为true 时自动显示图像,为false时不显示图像Picture属性:用于存放图像或照片常用方法:LoadPicture方法 7.2.8 TDBListBox和TDBComboBox组件 当用户更改当前记录中指定字段值的时候,可以使用TDBListBox或TDBComboBox组件来提供给用户一个可选的列表。用户可以从中选取适当的值来修改当前记录中的指定字段。 TDBListBox组件提供的是列表框,TDBComboBox组件提供的是下拉列表框,列表中的选项可以在设计阶段通过单击Items属性右边的省略按钮,打开“String List Editor”进行编辑。也可以在程

13、序运行时,使用Items的Add方法动态地改变 建立一个使用TDBListBox / TDBComboBox组件的应用程序的主要步骤 :(1) 向窗体中添加TDBListBox / TDBComboBox组件(2) 设置TDBListBox / TDBComboBox组件的DataSource属性,使它与数据库表产生联系(3)设置TDBListBox / TDBComboBox组件的DataField属性,使它指向数据库表中的指定字段(4) 设置TDBListBox / TDBComboBox组件的Items属性,为列表设计选项 7.2.9 TDBCheckBox和TDBRadioGroup组

14、件 TDBCheckBox组件主要是用来显示和修改一个布尔类型数据字段的字段值 TDBRadioGroup组件是允许用户在一组选项中选取惟一 一项的数据控制组件,主要是用来显示一个字段的字段值,以及通过在一组选项中选择其中的一项来编辑修改一个字段的字段值 7.2.10 TDBLookUpListBox和TDBLookUpComboBox组件 TDBLookupListBox和TDBLookupComboBox都是数据控制组件,它们从下列来源之一导出显示项目列表: 为数据库表定义的查找字段 第二数据源、数据字段及关键值 在任何一种情况中,用户都可从一个限制选择的列表中选择值来设置有效的字段值。当

15、用户选择一个列表项目时,基础数据库表的相应字段值被改变 主要属性 ListSource属性:用于连接从表数据源KeyField属性:用于连接从表关键字ListField属性:用于选择数据表中要在列表框或下拉列表框中显示的字段名DropDownAlign属性:用于设置下拉列表框中数据项的排列方式DropDownRows属性:用于设置下拉列表框中显示的数据项的数目。默认为10DropDownWidth属性:用于设置下拉列表框的宽度后三个只用于TDBLookupComboBox组件中 主要方法 CloseUp方法:当组件被下拉结束后,此时只显示编辑框而不显示下拉列表框,则触发OnCloseUp事件D

16、ropDown方法:若组件被下拉尚未结束,此时显示下拉列表框,触发OnCloseUp事件 7.3 数据访问组件 开发数据库的应用程序必须建立应用程序与数据库之间的联系,C+Builder组件面板上的数据访问组件(Data Access),又叫数据存取组件,提供了这种联系方法。它们通过使用数据库引擎访问数据库,并提供了用户接口(一般由数据控制组件实现)与数据库数据信息之间的联系 7.3.1 数据源组件TDataSource TDataSource组件提供了联系数据集组件(TTable组件、TQuery组件和TStoredProc组件)与数据控制组件(例如TDBGrid组件)的纽带。通过使用Dat

17、a Access 页上的TDataSource组件,可以利用数据控制组件显示、浏览以及修改数据集中的数据 主要属性 AutoEdit属性:用于控制用户是否能对与之连接数据集(表)中的数据进行编辑修改DataSet属性:用来指定一个与当前数据源组件连接的数据集组件的名字Enabled属性:决定与此数据源组件相连的数据控制组件是否显示数据State属性:返回与此数据源组件相连的数据集组件的当前状态,其取值见下表 状态含义dsInactive数据集已关闭,不能访问其数据dsBrowse数据集已打开,可以浏览但不能修改,这是数据集的默认状态值dsEdit处于编辑状态,可以修改数据dsInsert可插入

18、新记录dsSetKey只适用于ClientDataSet,可设置范围,且可调用GotoKey方法dsCalcFields正在处理OnCalcFields事件,不能用于非计算字段dsFilter正在进行过滤 主要方法 Edit方法:允许用户对与该数据源组件相连的数据库表进行编辑修改 主要事件 OnDataChange事件:发生在与该数据源组件相连的数据集的当前记录被编辑后,应用程序转移到其他字段或者转移到其他记录时,也就是提交被编辑的当前记录的时候 OnStateChange事件:发生在与该数据源组件相连的数据集的状态改变时 OnUpdateData事件:发生在向数据库提交对数据的改变之前 应用

19、程序中使用TDataSource组件的基本步骤 在窗体或数据模块中加入数据集组件,例如TTable组件,并设置其DatabaseName属性和TableName属性 在窗体或数据模块中加入数据源组件TDataSource,并将其DataSet属性设置为上一步中建立的数据集组件的名字 在窗体或数据模块中加入数据控制组件,例如:TDBGrid组件。并将其DataSource属性设置为第(2)步建立的数据源组件的名字 7.3.2 数据集组件TTable 在数据访问组件中,位于BDE组件页上的TTable、TQuery和TStoreProc三个组件用于联系应用程序和数据库表,它们同属于数据集(Data

20、Set)组件,都是从数据集继承而来,有着许多共同的属性、方法和事件 在C+Builder中,访问数据的基本单元是数据集对象。应用程序通过数据集组件来访问数据库的。一个数据集对象就代表了数据库的一张表格,或者是访问数据库的一个查询或存储的过程 TTable组件用于处理单一表,多表的处理使用TQuery组件 TTable组件与数据库表的连接 DatabaseName属性:用来指定当前数据库应用程序中所使用的数据集的来源,即数据库的名字TableType属性:用来指定当前TTable组件连接的类型TableName属性:用来指定组件所连接的数据库表 ReadOnly属性:用来确定是否可以对TTabl

21、e组件连接的数据表进行修改 数据库表的打开、关闭与清空 利用Active属性打开与关闭数据库表,Active属性值设为true时打开数据库表,设为false时将关闭数据库表调用Open方法打开数据库表,将Active属性值设为true调用Close方法关闭数据库表,同时将Active属性值设为false 调用EmptyTable方法可清空数据库表中的全部记录,该方法只能在数据库表关闭的情况下进行 记录指针的移动 First方法:将记录指针移到表的第一条记录Prior方法:将记录指针移到表的上一条记录Next方法:将记录指针移到表的下一条记录Last方法:将记录指针移到表的最后一条记录MoveB

22、y(n) 方法:将记录指针从当前位置移动|n|条记录。n0表示向后移动,n0表示向前移动Bof和Eof属性:布尔值,当前记录指针所处的位置为数据表的第一个记录时, Bof值为true;当前记录指针所处的位置为数据表的最后一个记录时, Eof值为true 记录的添加、插入、删除和编辑 Append方法:向数据库表的末尾添加一个新的空记录,并将数据集置为插入状态,新的记录置为当前记录AppendRecord方法:用给定的数据向数据库表的末尾添加一个新记录,并将数据集置为插入状态,新的记录置为当前记录Insert方法:在数据表当前记录之前插入一条空记录,并将数据集置为插入状态InsertRecord

23、方法:在数据表当前记录之前用给定的数据插入一条记录,并将数据集置为插入状态 Edit:调用Edit方法使数据表处于编辑状态 Post方法:将当前被编辑、修改的数据写入物理数据库表中 Cancel方法:用来取消对当前记录中一个或多个字段的修改 Delete方法:用来将当前记录从数据库表中删除Refresh方法:用来刷新当前数据表,通常用于对SQL数据库表的处理 记录的定位与查找 IndexFieldNames属性:用于指定数据表索引的字段名 EditKey方法:调用EditKey方法将数据集置于dsSetKey状态,也就是将TTable组件置于查询状态。同时,存储当前查询缓冲区的内容SetKey

24、方法:调用SetKey方法是将TTable组件置于查询状态。在执行查询前可以调用FieldByName方法来提供新的查询值FieldByName方法:查询或设置一个指定的字段 FindKey方法:查找满足条件的记录,若找到返回true并将记录指针定位在该记录上。否则为false,记录指针不变 GotoKey方法:查找满足条件的记录,与FindKey不同的是,FindKey只能对一个字段进行查找,GotoKey可以对多个字段进行查找。查询值是用SetKey或EditKey方法与Fields属性值确定的FindNearest方法:与FindKey方法很相似,不同之处在于FindNearest方法不

25、要求精确查询 GotoNearest方法:调用GotoNearest方法也是移动记录指针到与查询值最接近的记录上 设定数据库查找范围的方法 SetRangeStart和SetRangeEnd方法 :分别用来设定数据表中查找范围的起始值和终止值。调用SetRangeStart和SetRangeEnd方法后,将数据集置于dsSetKey状态,清除以前所有的起始与终止范围值,并将它们设置为NULL,再使用FieldByName方法设定查找范围的起始与终止值SetRange方法:调用SetRange方法用于设定记录值在一个范围内并在数据集中应用ApplyRange方法:调用ApplyRange方法使一

26、个由SetRangeStart和SetRangeEnd,或由EditRangeStart和EditRangeEnd所确定的范围生效 CancelRange方法:与ApplyRange方法相反,CancelRange方法是取消一个正在生效的范围 EditRangeStart和EditRangeEnd方法:调用EditRangeStart和EditRangeEnd方法来改变一个已存范围的起始值和结束值KeyExclusive属性:当KeyExclusive属性为true时,执行查询范围包括起始与终止值。否则查询范围不包括起始与终止值 过滤记录 Filter属性:定义一个数据表过滤器,只有那些满足过

27、滤器条件的记录才会被显示Filtered属性:为true时,过滤器有效,满足条件的记录显示。否则,所有记录都显示出来 数据表中字段数、记录数与控制连接 FieldCount属性:用于计算打开的数据库表中的字段数KeyFieldCount属性:用于计算数据库表中关键字的字段数RecordCount属性:用于计算数据库表中的记录数DisableControls方法:调用DisableControls方法,可断开TTable组件与数据控制组件的连接,禁止在数据控制组件上显示对表的处理过程EnableControls方法:调用EnableControls方法,可恢复TTable组件与数据控制组件的连接

28、,允许在数据控制组件上显示对表的处理过程 用TTable组件实现多表关联 MasterSource属性用来指定在主从关系的数据库表中,用来作为主表的DataSource组件的名称。 MasterFields用来在主表中指定一个或多个对应当前表中的字段以达到在数据库表之间建立主从关系的目的。在指定主表以后,用MasterFields属性框右边的“.”按钮打开“Field Link Designer”对话框来建立主从表之间的联系 用TTable组件创建数据表结构 数据表结构除了在Database Desktop中创建和维护外,也可以在程序运行过程中根据需要通过TTable组件的CreateTabl

29、e方法来创建。该方法在程序运行过程中创建一个新数据表结构。在调用该方法之前必须先指定数据表名、表的类型、字段定义和索引定义 数据表的加锁和解锁 LockTable方法:该方法为调用它的应用程序在运行时对表加锁,防止其他(用户)程序对该表进行读写。用法为: LockTable(TLockType LockType);其中LockType为加锁的类型,可选的值为:ltReadLock读加锁,其他应用程序不能从表中读数据 ltWriteLock 写加锁,其他应用程序不能向表中写数据 UnLockTable方法:该方法将解除应用程序的读锁或写锁。若两种锁都要解除,则需调用两次。用法为:UnlockTa

30、ble(TLockType LockType); Table组件的主要事件 事件说 明BeforeCancel、AfterCancel发生在执行取消对当前记录的修改之前、后BeforeClose、AfterClose发生在执行关闭数据集之前、后BeforeDelete、AfterDelete发生在删除当前记录之前、后BeforeEdit、AfterEdit发生在进入编辑当前记录的状态之前、后BeforeInsert、AfterInsert发生在进入插入记录的状态之前、后BeforeOpen 、AfterOpen发生在执行打开数据集之前、后BeforePost 、AfterPost发生在向数据库

31、或缓存写入记录之前、后BeforeScroll、AfterScroll发生在从一个记录转到另一个记录之前、后OnCalcFields发生在重新计算要计算的字段之时OnFilterRecord发生在数据集中的一条记录变成当前记录并且过滤生效时OnNewRecord发生在插入一条记录之时OnUpdateRecord当缓存的更新特性应用到记录时7.3.3 字段组件TField 字段组件TField表示数据库字段中的一个字段属性,如它的数据类型和大小。它也表示字段的显示属性,如对齐方式、显示格式和编辑格式。如果在数据集中浏览记录,字段组件也可以用来查看和修改当前记录的相应字段值。字段组件在设计时不能直

32、接被看到,而是与一个数据集组件关联,并通过该数据集提供给数据控制组件(如TDBEdit和TDBGrid)来存取数据库字段 字段对象的建立 动态字段对象 :动态字段是C+ Builder为打开的数据集组件如表TTable或查询TQuery中的每一个字段建立的对应字段集Fields,在数据集被打开期间存在,关闭时撤消。每一次重新打开使用动态字段组件的数据集,C+ Builder都会重新生成一个全新的动态字段组件集,它们是根据该数据集中的数据表的当前结构生成的 永久字段对象 :缺省情况下,数据集字段是动态的。它们的属性和可用性是自动设置的,且不能用任何方法改变。必须为数据集创建永久字段组件,才能控制

33、字段组件的属性和事件。可以使用字段编辑器创建永久字段组件 字段对象的属性 字段对象的属性的设置可先打开字段编辑器,在字段编辑器中选中字段,在对象查看器中设置。也可以先在对象浏览器中选择字段所在的数据集,在展开的字段节点(Fields)下找到相应的字段,再在对象查看器中进行设置 字段对象的访问和数据类型的转换访问字段对象有两种方式:-Fields-Fieldsn- 转换函数;-FieldByName(“字段名”)- 转换函数;在编程过程中,数据的储存和传递时要进行数据类型的互相转换,常用的数据转换函数如下:AsString将当前的数据类型转换为字符型AsInteger将当前的数据类型转换为整型A

34、sFloat将当前的数据类型转换为浮点型AsDatetime将当前的数据类型转换为日期型AsBoolean将当前的数据类型转换为布尔型 计算字段 有时数据表中的现有字段不能满足用户的需求,需要增加一些数据表中没有的字段,这些字段可以根据数据表中的字段计算出来。创建和使用计算字段步骤如下:(1) 在窗体中打开字段编辑器 (2) 在字段编辑器中单击鼠标右键,选择选项“New field” (3) 在Name中输入所需的计算字段名 (4) 在Type中选择类型 (5) 在Component中输入字段对象的Name(自动设置) (6) 在Field type中选择Calculated (7) 单击OK

35、按钮,出现字段编辑器对话框,新的字段已经加入 7.3.4 TDatabase组件 TDatabase组件在应用程序中通过建立与数据库之间的联系对数据库进行控制。位于BDE页上的TDatabase组件常在以下情况下使用: (1)建立与数据库的永久连接 (2)数据库服务器要求用户的登录 (3)控制事务处理 (4)应用程序指定的BDE数据库别名 主要属性 AliasName和DriverName属性:AliasName和DriverName是BDE有关的两个互斥的属性。AliasName为数据库组件指定一个已经存在的BDE别名。DriverName是BDE驱动器的名称DatabaseName属性:用

36、于为一个数据库组件提供一个当前在应用程序中使用的名称Params属性:通过该属性在应用程序与数据库建立连接前,配置SQL Links或ODBC驱动程序参数Connected属性:用于设置与数据库连接的状态。设为true时建立连接LoginPrompt属性 :用于设置应用程序登录到数据库服务器时,当服务器请求输入用户名和口令时是否显示一个标准的登录对话框KeepConnection属性:设置应用程序是否保持对数据库的连接,即当与数据库关联的所有数据集都被关闭时,如果其值为true,将保持连接 主要方法 Open方法:调用Open方法将与数据库服务器建立连接。将Connected属性设置为true

37、,也将调用Open方法 Close方法:调用Close方法将关闭与数据库服务器的连接。将Connected属性设置为false,也将调用Close方法 7.3.5 TSession组件 BDE页上的TSession组件用来实现在一个应用程序中控制与数据库的联系。TSession组件是一个非可视组件,也不需要显式地创建一个TSession组件(即窗体上可以不添加该组件),但可以在应用程序中使用它。C+Builder自动地为数据库应用程序创建一个默认的TSession组件,该TSession组件的名字为Session,它处理标准的数据库联系。在应用程序运行时,可以通过使用它的属性、方法和事件控制这个默认的TSession组件 主要属性 DatabaseCount属性:通过检查DatabaseCount属性值来获得与此TSession组件相连的活动数据库的数目。当与数据库的联系打开或中断时,DatabaseCount属性值会发生改变Databases属性:通过使用Databases属性来访问与此TSessi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论