数据库应用开发基础.ppt

上传人:牧羊曲112 文档编号:6578505 上传时间:2023-11-14 格式:PPT 页数:59 大小:536.50KB
返回 下载 相关 举报
数据库应用开发基础.ppt_第1页
第1页 / 共59页
数据库应用开发基础.ppt_第2页
第2页 / 共59页
数据库应用开发基础.ppt_第3页
第3页 / 共59页
数据库应用开发基础.ppt_第4页
第4页 / 共59页
数据库应用开发基础.ppt_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《数据库应用开发基础.ppt》由会员分享,可在线阅读,更多相关《数据库应用开发基础.ppt(59页珍藏版)》请在三一办公上搜索。

1、第8章 数据库应用开发基础,学习目标掌握数据库的基础知识、了解相关基本概念掌握常用的SQL数据操作语句掌握ADO.NET数据访问技术了解数据集(DataSet)的使用了解数据绑定技术,并掌握DataGridView控件的使用,第8章 数据库应用开发基础,学习内容 8.1 VB.NET数据库应用基础 8.2 SQL数据操作语句 8.3 ADO.NET应用基础 8.4 DataSet的建立和使用 8.5 DataSet的数据绑定,8.1 数据库应用基础 基本概念,1.数据库 数据库(DB):储存在计算机内的、有组织的、可共享的、独立于应用程序的、相互关联的数据集合。数据模型:数据库的组织形式。关系

2、模型:用二维表格来表示实体和实体之间的联系。表由行、列组成 表中的每一行数据称为记录表中的每一列数据称为字段,同一字段的数据具有相同的数据类型,并具有字段名,实体:客观世界存在的事物在信息世界的反映,8.1 数据库应用基础 基本概念,2.数据库管理系统 数据库管理系统(DBMS)是一套操纵和管理数据库的大型软件,为用户或应用程序提供使用和维护数据库的方法,包括数据库的建立、查询、更新及各种数据控制操作等。,数据库管理系统是基于数据模型的,基于关系数据模型的称为关系数据库管理系统。,8.1 数据库应用基础 基本概念,3.数据库系统 数据库系统(DBS)是实现有组织地、动态地存储大量关联数据、方便

3、多用户访问的计算机硬软件和数据资源组成的系统。包括:计算机硬件系统、计算机软件系统、数据库和用户。其中:软件系统主要包括操作系统、DBMS和应用软件DBMS是DBS的核心部分用户一般分为终端用户、程序开发人员和数据库管理员,8.1 数据库应用基础 创建sql数据库,用sql server 创建“个体工商管理”数据库 用户信息表,8.2 SQL数据操作语句 Select语句,SQL:结构化查询语言 Select语句:用于对表中记录进行查询 Select 字段列表 From 表名 Where 条件表达式 Order By 字段列表ASC|DESC例,(1)查询“用户信息表”表中的所有记录 Sele

4、ct*From 用户信息表(2)查询“用户信息表”表中的所有记录,按“权限”字段排序 Select*From 用户信息表 Order By 权限(3)查询“用户信息表”表中普通用户的所有记录 Select*From 用户信息表 Where 权限=普通用户,8.2 SQL数据操作语句 Insert语句,Insert语句:用于在表中添加一条新记录 Insert Into 表名(字段1,字段2)Values(值1,值2)可以对表中的部分字段进行赋值。例,插入一条记录,该记录只有2个字段被赋值:Insert Into 用户信息表(用户,密码)Values(admin,admin)若记录所有字段都要赋值

5、,则可以省略表名后面的字段列表,但是字段值的顺序必须与表中字段的顺序一致。例,插入一条记录,该记录的所有字段均被赋值:Insert Into 用户信息表 Values(1,admin,admin,系统管理员),8.2 SQL数据操作语句 Delete语句,Delete语句:用于删除表中指定的记录 Delete From 表名 Where 条件表达式 注意:如果不指定条件,则删除表中全部记录 例,(1)删除“用户信息表”表中用户名为admin的所有记录:Delete From 用户信息表 Where 用户=admin(2)删除“用户信息表”表中的所有记录:Delete From 用户信息表,8.

6、2 SQL数据操作语句 Update语句,Update语句:用于修改表中指定的记录 Update 表名 Set 字段1=值1,字段2=值2,Where 条件表达式注意:如果不指定条件,则更新表中的所有记录 例,(1)将“用户信息表”表中“普通用户”的密码更改为vip:Update 用户信息表 Set 密码=vip Where 权限=普通用户(2)将“用户信息表”表中所有用户的密码清空:Update 用户信息表 Set 密码=Null,8.3 ADO.NET应用基础介绍,ADO.NET 是.NET Framework下的一种新的数据访问编程模型,同时提供对XML的强大支持。ADO.NET是Mic

7、rosoft公司发布的新一代数据存取技术,是一种全新的数据库访问模式,使应用程序的开发人员能方便的访问多种不同的数据源。ADO.NET提供对Microsoft SQL Server等数据源的一致访问。数据共享应用程序可以使用ADO.NET来连接到数据源,并检索、操作和更新数据。,8.3 ADO.NET应用基础体系结构,ADO.NET包括2个核心组件:DataSet 数据提供程序(Data Provider)ConnectionCommandDataReaderDataAdapter,8.3 ADO.NET应用基础体系结构,事务,参数,数据提供程序,数据表,8.3 ADO.NET应用基础 ADO

8、.NET的结构,1.DataSet DataSet:将表的内容以一定的格式缓存在客户端计算机内存中的数据集对象包含一个DataTable对象集合(DataTableCollection)包含一个DataRelation对象集合(DataRelationCollection),8.3 ADO.NET应用基础 ADO.NET的结构,2.NET框架数据提供程序:用于访问不同类型的数据源,.NET框架提供了4个数据提供程序SQL Server:使用命名空间OLE DB:使用命名空间ODBC:使用命名空间Oracle:使用 命名空间,8.3 ADO.NET应用基础 ADO.NET的结构,数据提供程序的4

9、个核心对象:Connection对象:建立与特定数据源的连接Command:用来执行对数据源进行各种操作的SQL命令DataReader:以只能向前的、只读的数据流方式接收Command对象的ExecuteReader方法返回的数据。DataAdapter:是DataSet和数据源之间交换数据的桥梁 若访问sql数据库,上述4个对象分别表示为:SQLConnection、SQLCommand、SQLDataReaderSQLDataAdapter,数据集(Dataset),SQL Server.NET 数据提供程序,OLE DB.NET 数据提供程序,SQL Server 7.0(或更高版本)

10、,OLEDB 数据源(ACCESS),SQL Server 7.0(或更高版本),在连接环境中,只有操作结束后才断开与数据库的连接,SqlConnection,SqlCommand,SqlDataReader,在连接环境中使用ADO.NET,在与数据库断开连接的情况下,数据库资源并不被独占,SqlConnection,数据适配器,数据集,SQL Server 7.0(或更高版本),在非连接环境中使用ADO.NET,8.3 ADO.NET应用基础 连接数据库,1.引入与所用数据库相对应的命名空间 在程序文件的开始处引入访问sql server数据库需引入SqlClient类命名空间 2.确定连接

11、字符串(连接SQL数据库示例)server=210.37.77.122;database=工商户信息理;UID=sa;Password=123;Trusted_Connection=false,8.3 ADO.NET应用基础 连接数据库,3.定义SqlConnection对象 Dim 对象名 As New SqlConnection 对象名.ConnectionString=连接字符串 Dim 对象名 As New SqlConnection(连接字符串)Dim 对象名 As SqlConnection 对象名=New SqlConnection(连接字符串)4.SqlConnection对象

12、的常用方法 Open:打开连接字符串中所指定的数据库 SqlConnection对象名.Open()Close:关闭数据库连接,释放SqlConnection对象 SqlConnection对象名.Close(),8.3 ADO.NET应用基础 连接数据库,【例8.1】连接“master.mdf”数据库,8.3 ADO.NET应用基础 连接数据库,在Public Class Form1的前面引入SqlClient类类命名空间,Private Sub Button11_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)

13、Handles Button11.Click Dim db_connection As String=“server=116.13.57.158sqlexpress;database=工商户信息管理;UID=sa;Password=123;Trusted_Connection=false 定义连接字符串 Dim conn As New SqlConnection conn.ConnectionString=db_connection conn.Open()MsgBox(连接成功)conn.Close()End Sub,sql 2005的远程连接数据库准备工作,1.开启SQL 2005的远程连接

14、功能2.在Windows 防火墙中为“SQL Server 2005”创建例外 3.在Windows 防火墙中为“SQLBrowser”创建例外 4.设置SQL 登陆模式(关键)5.启用sa帐号和修改sa密码ALTER LOGIN sa ENABLE;ALTER LOGIN sa WITH PASSWORD=;6.数据库引擎没有启动。7.检查远程服务器是否启动了sql server 服务。如果没有,则启动。,8.3 ADO.NET应用基础 数据操作,成功连接Sql Server数据库之后,可通过SqlCommand对象和SqlDataReader对象访问数据源的数据。1.SqlCommand对

15、象:利用所建立的连接,通过SQL语句对数据源执行查询、插入、删除和更新等操作(1)定义SqlCommand对象方法一:Dim 对象名 As New SqlCommand 对象名.CommandText=SQL命令字符串 对象名.Connection=Connection对象名方法二:Dim 对象名 As New SqlCommand(SQL命令字符串,Connection对象名)方法三:Dim 对象名 As SqlbCommand 对象名=New SqlCommand(SQL命令字符串,Connection对象名),8.3 ADO.NET应用基础 数据操作,(2)SqlCommand对象的常用

16、属性 CommandText:获取或设置对数据源执行的SQL语句 Connection:获取或设置OleDbCommand对象使用的OleDbConnection对象的名称(3)SqlCommand对象的常用方法ExecuteScalar:对连接对象执行SQL语句,返回结果值ExecuteNonQuery:对连接对象执行SQL语句,返回受影响的记录数 ExecuteReader:对连接对象执行SQL查询语句,返回一个DataReader对象,例,Dim db_connection As String=server=210.37.77.122;database=工商户信息管理;UID=sa;Pa

17、ssword=123;Trusted_Connection=false 定义连接字符串 Dim conn As New SqlConnection conn.ConnectionString=db_connection conn.Open()Dim cmd As New SqlCommand cmd.CommandText=delete from 用户信息表where 用户=3200001 cmd.Connection=conn cmd.ExecuteNonQuery()MsgBox(已执行数据删除操作!)conn.Close(),8.3 ADO.NET应用基础 数据操作,【例8.2】删除“用

18、户信息表”中用户为“190031”的记录,Dim db_connection As String=server=210.37.77.122;database=工商户信息管理;UID=sa;Password=123;Trusted_Connection=false 定义连接字符串 Dim conn As New SqlConnection conn.ConnectionString=db_connection conn.Open()Dim data As String data=InputBox(请输入要删除的用户名:,输入用户名)Dim cmd As New SqlCommand cmd.Co

19、mmandText=delete from 用户信息表where 用户=&data&cmd.Connection=conn cmd.ExecuteNonQuery()MsgBox(已执行数据删除操作!)conn.Close(),8.3 ADO.NET应用基础 数据操作,【说明】如果要删除指定的记录,程序如下:,8.3 ADO.NET应用基础 数据操作,2.SqlDataReader对象:与数据库连接并执行查询命令后,通过SqlDataReader对象得到只读、只进的数据流(1)SqlDataReader对象的常用属性和方法 HasRows属性:判断当前数据集是否包含数据。如果有数据,该属性值为

20、true,否则为false。Read方法:用于读取记录。每调用一次该方法,则从结果集中读取一条记录,同时隐含的记录指针自动前进到下一条记录。该方法在读到数据时返回true,数据读完后返回false。Close方法:关闭SqlDataReader对象。,8.3 ADO.NET应用基础 数据操作,(2)定义SqlDataReader对象 Dim 对象名 As SqlDataReader(3)创建SqlDataReader对象 建立与数据库的连接通过SqlCommand对象对数据库执行查询命令调用SqlCommand对象的ExecuteReader方法【例8.3】单击“显示数据”按钮可在列表框中显示

21、“用户信息表”中的用户名和权限,Dim db_connection As String=server=210.37.77.122;database=工商户信息管理;UID=sa;Password=123;Trusted_Connection=false 定义连接字符串 Dim conn As New SqlConnection conn.ConnectionString=db_connection conn.Open()Dim cmd As New SqlCommand cmd.CommandText=select*from 用户信息表 cmd.Connection=conn Dim read

22、er As SqlDataReader reader=cmd.ExecuteReader()If reader.HasRows()Then While reader.Read ListBox1.Items.Add(reader(用户)&reader(权限)End While End If reader.Close()conn.Close(),8.3 ADO.NET应用基础 数据操作,数据操作的各对象与其方法和属性,返回一个DataReader对象,属性:HasRow,方法,close,read,8.3 ADO.NET应用基础 综合应用实例,【例8.4】“用户管理”用于维护数据库中的“用户信息表

23、”,除了显示用户信息外,还可以实现记录的添加、更新、删除等操作。,窗体中用到的主要控件的名称、类型、特定属性设置和作用见教材表8-3。,8.4 DataSet 创建DataSet对象,定义DataSet对象Dim 对象名 As DataSet 对象名=New DataSet()Dim 对象名 As New DataSet()例如,创建一个名为userDS的DataSet对象:Dim userDS As New DataSet()Clear()方法:清除数据集中的数据。例如,清除名为userDS的DataSet对象中的所有数据:userDS.Clear(),8.4 DataSet 创建SqlDa

24、taAdapter对象,定义SqlDataAdapter对象 Dim 对象名 As SqlDataAdapter 例,Dim adapt As SqlDataAdapterSqlbDataAdapter对象实例化 SqlDataAdapter对象名=New SqlDataAdapter(SQL语句串,SqlConnection对象名),SqlDataAdapter对象的常用方法 Fill方法:将SqlDataAdapter对象获取的数据填充到 已经定义的DataSet中。SqlDataAdapter对象名.Fill(DataSet对象名,DataSet表名)“DataSet表名”可以与数据源中

25、的表不同名。Update方法:将DataSet中修改的数据写回数据源 OleDbDataAdapter对象名.Update(DataSet对象名,DataSet表名),建立dataset数据集过程,SqlConnection,数据适配器(sqlDataAdapter),数据集sqldataset,SQL Server 7.0(或更高版本),Dim db_connection As String=server=210.37.77.122;database=工商户信息管理;UID=sa;Password=123;Trusted_Connection=false 定义连接字符串 Dim conn A

26、s New SqlConnection conn.ConnectionString=db_connection conn.Open(),Dim adapt As SqlDataAdapter Dim cmdText As String=Select*From 用户信息表adapt=New SqlDataAdapter(cmdText,conn),Dim userDS As New DataSet()创建DataSet对象adapt.Fill(userDS,UserTable)填充DataSet,8.4 DataSet 创建DataSet对象,Tables属性:访问DataSet中的表数据Row

27、s属性:访问该表的行数据Item属性:用于访问指定列中的数据Count属性:用于获取数据的总行数 例如,userDS.Tables(“UserTable”).Rows(i).Item(1)(列号可用字段名代替)上面的语句可以写成:userDS.Tables(UserTable).Rows(i).Item(用户),8.4 DataSet 填充DataSet示例,【例8.5】通过SqlDataAdapter对象将“个体工商管理.mdb”数据库中的“用户信息表”填充到DataSet。,Dim db_connection As String=server=210.37.77.122;database=

28、工商户信息管理;UID=sa;Password=123;Trusted_Connection=false 定义连接字符串 Dim conn As New SqlConnection conn.ConnectionString=db_connection conn.Open()Dim adapt As SqlDataAdapter Dim cmdText As String=Select*From 用户信息表 adapt=New SqlDataAdapter(cmdText,conn)Dim userDS As New DataSet()创建DataSet对象 adapt.Fill(userDS

29、,UserTable)填充DataSet Dim i As Integer ListBox1.Items.Add(用户名&权限)ListBox1.Items.Add(-)For i=1 To userDS.Tables(UserTable).Rows.Count-1 ListBox1.Items.Add(userDS.Tables(UserTable).Rows(i).Item(用户)&userDS.Tables(UserTable).Rows(i).Item(权限)Next conn.Close(),8.4 DataSet 填充DataSet示例,数据集中,表的行号从0开始,因此循环语句的终

30、值是“.Count 1”,8.5 DataSet的数据绑定,数据绑定:通过属性设置,使控件能从数据源中得到数据,从而能通过窗体来显示和处理这些数据。绑定的类型:简单数据绑定和复杂数据绑定 简单绑定:将控件绑定到表的某一个字段 复杂绑定:将一个控件绑定到表的多个字段 在VS.NET 2005中,可与DataSet进行复杂数据绑定的常用控件是DataGridView。,8.5 DataSet的数据绑定 复杂绑定,DataGridView:一个多行多列数据绑定控件,以表格的形式显示DataSet中的数据,可以对DataSet的记录进行浏览、增加、删除、修改等操作。1.DataGridView控件的常

31、用属性DataSource:获取或设置DataGridView控件所绑定的 数据源DataMember:获取或设置数据源中的表对象名称 ReadOnly:表示或设置DataGridView控件的只读状态,默认为False。,8.5 DataSet的数据绑定 复杂绑定,1.在程序运行时进行数据绑定设置【例8.6】窗体装入时,在DataGridView控件中显示填充到 DataSet的“用户信息表”。,在窗体上添加1个DataGridView控件,Imports System.Data.sqlclient 引入 sqlclient 类命名空间Public Class Form1 Private S

32、ub Form1_Activated(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.Activated Dim conn As New OleDbConnection(server=210.37.77.122;database=工商户信息管理;UID=sa;Password=123;Trusted_Connection=false)conn.Open()定义OleDbDataAdapter对象,并实例化 Dim cmdText As String=Select*From 用户信息表 Dim adapt As New

33、sqlDataAdapter(cmdText,conn)Dim userDS As New DataSet()创建DataSet对象 adapt.Fill(userDS,UserTable)填充DataSet 绑定数据 DataGridView1.DataSource=userDS DataGridView1.DataMember=UserTable DataGridView1.ReadOnly=True conn.Close()End Sub,代码如下:,2.通过向导在设计时进行数据绑定设置(课本自学)3.在设计时进行数据绑定 操作步骤如下方法(一):1.创建数据连接和数据适配器添加“工具箱

34、”-“数据”-”SqlDataAdapter”对象,数据适配器的向导将自动,最终获得数据连接sqlconnection和数据适配器SqlDataAdapter2 生成数据集选择“数据”菜单“生成数据集”,获得数据集“dataset11”3添加并绑定datagridview控件Datasource属性设置为“dataset11”Datamember设置为要显示的表4 填充数据集SqlDataAdapter1.Fill(用户信息表DataSet1)5 更新数据库SqlDataAdapter1.update(用户信息表DataSet1),方法(二)1.创建项目数据连接 工具-连接到数据库2 创建项目

35、数据源选择“数据”菜单“添加数据源”,获得数据集3添加并绑定datagridview控件Datasource属性设置为“dataset11”Datamember设置为要显示的表4 填充数据集SqlDataAdapter1.Fill(用户信息表DataSet1)5 更新数据库SqlDataAdapter1.update(用户信息表DataSet1),8.5 DataSet的数据绑定 简单绑定,支持简单绑定的控件主要有TextBox和Label等只显示单个值的控件。1.用代码进行绑定控件名.DataBindings.Add(New Binding(属性,DataSet对象名,数据成员)例,将Tex

36、tBox1控件的Text属性绑定到userDS数据集的UserTable表的“用户”字段:TextBox1.DataBindings.Add(New Binding(text,userDS,UserTable.用户),2.图形化方式:选中绑定的控件,如文本框展开 DataBindings 属性选择要绑定的属性,如 Text 属性选择要绑定的数据源选择要绑定的数据元素,简单数据绑定-TextBox,8.5 DataSet的数据绑定 简单绑定,【例8.8】窗体装入时,以只读形式显示填充到DataSet的“用户信息表”的“用户名”和“权限”字段,并通过增加的导航按钮实现数据导航。,8.5 DataS

37、et的数据绑定 简单绑定,数据导航的设置(使用BindingManagerBase)(1)创建BindingManagerBase对象 Dim 对象名 As BindingManagerBase 具体实现需要BindingContext对象来完成:BindingManagerBase对象名=BindingContext(DataSet对象名,DataSet表名)例,(2)BindingManagerBase的常用属性Position:获取或设置当前数据指针 表中第1条记录的Position属性值为0Count:获取表中所包含的记录总数 表中最后一条的Position属性值为Count-1,8.

38、5 DataSet的数据绑定 简单绑定,程序代码:(1)在Public Class Form1的前面输入如下语句:(2)由于多个事件过程都使用BindingManagerBase对象,所以在窗体声明段定义该对象:,Imports,Dim bind As BindingManagerBase,8.5 DataSet的数据绑定 简单绑定,(3)窗体装入(Load)事件过程:,Private Sub 简单绑定2_Load(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles MyBase.Load Dim db_conne

39、ction As String=server=210.37.77.122;database=工商户信息管理;UID=sa;Password=123;Trusted_Connection=false 定义连接字符串 Dim conn As New SqlConnection conn.ConnectionString=db_connection conn.Open()Dim adapt As SqlDataAdapter Dim cmdText As String=Select*From 用户信息表 adapt=New SqlDataAdapter(cmdText,conn)Dim userDS

40、 As New DataSet()创建DataSet对象 adapt.Fill(userDS,UserTable)填充DataSet conn.Close()TextBox1.DataBindings.Add(New Binding(text,userDS,UserTable.用户)TextBox2.DataBindings.Add(New Binding(text,userDS,UserTable.权限)bind=BindingContext(userDS,UserTable)End Sub,(4)各导航按钮的单击事件过程:,“第一条”按钮代码:bind.Position=0“下一条”按钮代

41、码 If bind.Position=bind.Count-1 Then MsgBox(已经是最后一条记录)Else bind.Position=bind.Position+1 End If“上一条”按钮代码 If bind.Position=0 Then MsgBox(已经是第一条记录)Else bind.Position=bind.Position-1 End If“最后一条”按钮代码 bind.Position=bind.Count-1,数据导航的设置(使用bindingsource)按钮代码:,“第一条”按钮代码:用户信息表BindingSource.Position=0“上一条”按钮

42、代码 If 用户信息表BindingSource.Position=0 Then MsgBox(已经是第一条记录!)Else 用户信息表BindingSource.Position=用户信息表BindingSource.Position-1 End If“下一条”按钮代码 If 用户信息表BindingSource.Position=用户信息表BindingSource.Count-1 Then MsgBox(已经是最后一条记录!)Else 用户信息表BindingSource.Position=用户信息表BindingSource.Position+1 End If“最后一条”按钮代码 用户

43、信息表BindingSource.Position=用户信息表BindingSource.Count-1,补充:绑定其他控件,LabelListboxComboboxcheckbox,8.6 本章小结,数据库(DB)是指储存在计算机内的、有组织的、可共享的、独立于应用程序的、相互关联的数据集合。数据模型是数据库的组织形式,目前使用最为广泛的是关系模型。数据库管理系统(DBMS)是一套操纵和管理数据库的大型软件,基于关系数据模型的称为关系数据库管理系统。在Access关系数据库管理系统中,一个数据库就是一个扩展名为mdb的文件。表中的每一行数据称为记录,每一列数据称为字段,同一字段的数据类型相同

44、。,8.6 本章小结,SQL是一种结构化查询语言。数据操作语句中,Select语句用于对表中记录进行查询,Insert语句用于在表中添加一条新记录,Delete语句用于删除表中指定的记录(不指定条件则删除全部记录),Update语句用于修改表中的记录(不指定条件则更新表中所有记录)。ADO.NET的两个核心组件是数据提供程序和DataSet。对Access数据库而言,数据提供程序有4个核心对象:OleDbConnection负责建立与数据源的连接OleDbCommand用来执行对数据源进行各种操作的SQL命令OleDbDataReader可得到只读、只进的数据流OleDbDataAdapter是DataSet和数据源之间交换数据的桥梁,8.6 本章小结,DataSet对象是一个驻留在客户端内存中的数据集对象,一般用于显示数据,如果要将DataSet中修改的数据写回数据源比较烦琐。数据绑定是使控件与DataSet中的数据建立联系,从而能通过窗体来显示和处理DataSet中的数据。数据绑定有简单绑定和复杂绑定之分简单绑定:将控件绑定到表的某一个字段复杂绑定:将一个控件绑定到表的多个字段则为,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号