欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第三章+asp数据库编程.doc

    • 资源ID:70344370       资源大小:135KB        全文页数:41页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第三章+asp数据库编程.doc

    在ASP中使用数据库网易科技报道 前往科技论坛2004-11-05 13:01:35 来源: 网易社区   不良信息举报发表评论查看评论本文关键字:教程/ASP/技巧    ASP有一个最重要的功能,就是它可以让你非常轻松地连接数据库。通常都是和一个Access或者一个SQL数据库相连。因为Access是最容易起步的,同时,在你的机器上也许已经都装有Access了,所以,在下面的例子中,我们都将使用Access来做例子。一旦你学习了ASP和Access数据库连接的核心技术方法,当你开始使用SQL server的时候,你就会发现,两者所需要的关键技术是基本相同的。    当你要连接数据库的时候,你需要在服务器上将这个数据库打开。你可以通过使用数据源名(DSN)或者通过在你的脚本语言中直接使用一个DSN-less连接的方法来连接和打开数据库。 创建一个数据源名(DSN)     你可以通过在控制面板中给你的数据库建立一个系统DSN来使你的数据库可以在ASP中连接使用。你可以在你的本地计算机上建立若干个DSN,每个DSN对应你使用的不同的数据库。在建立完DSN之后,你就可以在你的本地服务器上测试你的页面了。如果你的网站是由    ISP提供服务的,并且这个ISP支持ASP,那么很有可能它就会提供一个GUI接口,来给你的数据库创建一个DSN。    在Windows 95/98/NT中,打开控制面板(开始菜单>设置>控制面板),双击ODBC进入。     选择系统DSN,点击Add。     选择“Microsoft Access Driver”,点击结束。     填写数据源名。这是你给你的数据库起的名字,所以和一个alias是同样的操作。     在数据库选择中点击选择按钮,浏览系统中你创建的Access数据库所存放的位置。     点击OK     现在,新的DSN现在就会在系统DSN中显示,并且可以在你的本地服务器上使用了。连接数据库     让我们建立一个DSN-less连接,并且看看是如何连接数据库的。当你创建一个DSN的时候,你就已经存储了关于这个数据库的一些信息,所以你不需要在每次需要使用一些信息的时候重复它们,这些信息如:数据库类型、名称、存放地点和可选性、用户和密码。    要创建一个DSN-less连接,你就需要提供同样的信息。下面这个例子就显示了如何给一个叫products的数据库建立一个DSN-less连接:<% StrConnect = "Driver=Microsoft Access Driver (*.mdb); DBQ=C:dbproducts.mdb"Set objConn = Server.CreateObject ("ADODB.Connection")objConn.OpenStrConnect%>     第二行定义了数据库的驱动和物理路径。为了要使用一个DSN-less连接,你就需要知道实际的文件存放地点(绝对路径)。Server.MapPath给任何一个使用主机服务的人提供了一个简单的工作环境来查找出那些难于查到的实际访问路径。    如果我们已经建立了一个系统DSN,并命名为products,则连接码应该为:<%Set objConn = Server.CreateObject ("ADODB.Connection")objConn.Open "products"%>    现在,数据库就已经打开了,那么你可以做些什么呢?第一件事情当然就是阅读数据库中的一系列记录,并将它们放到你的页面中去。但是,在这之前,你需要一个recordset。Recordset     一个recordset是存储在特殊数据库表上的所有信息。所以,当你打开这个recordset的时候,表中所有的行和列的内容都是可访问的。你需要打开这个recordeset,正如你需要打开数据库连接一样。它们的命令是相似的:Set objRec = Server.CreateObject ("ADODB.Recordset")objRec.Open "downloadable", strConnect, 0,1,2    这个语句就创建了一个名为downloadable表的recordset(objRec),这个表在products数据库的strConnect中定义。使用Recordset open, 我们就可以循环浏览这个表,并且可以将它的所有内容都显示到屏幕上。或者,我们可以测试特定字段的内容,也可以只将我们关注的内容写到屏幕上去。    每一列代表一个字段。所以,如果数据库表如下所示:Product ID SKU Name File 1 PR12345 Product A install_a.exe 2 PR12346 Product B Install_b.exe    那么,我们就有如下字段的内容:ProductID, SKU, Name, 和File。你的表很可能会有许多额外的字段内容,可能包含很多东西,如价格或者是产品(商品)描述。但是这个示意图可以给你提供最基本的数据库表的概念。填写recordset内容     使用recordset是非常容易的一件事情。如果你想要循环浏览数据库,并将所有的信息都打印到屏幕上显示,你可以按照下面来操作: While NOT objRec.EOF ' says to do this as long as we haven't reached the end of the file  Response.WriteobjRec("ProductID") & ", "   Response.WriteobjRec("SKU") & ", "   Response.WriteobjRec("Name") & ", "   Response.WriteobjRec("File") & "<BR>"     objRec.MoveNext      Wend ;     即使你没有如此使用过loop,你仍然可以通过阅读这个代码来将信息写到comma-delimited字符串里,并且当数据库表中创建了一个新行的时候,就重新创建一个新的行,来记录表中的那一行。你可以使用同样的方法将数据写到HTML表格中去。通过使用Response.Write添加你的TABLE标签,需要记住以下几点:你的HTML 标签和引号中的内容。 如果你的标签或者内容使用了引号,注意使用双引号:<FONT SIZE=""+2"">. 使用&来连接变量和HTML/内容信息 选择recordset中的字段假设我们的products数据库同样包含一个叫OS的字段,假设这个字段是一个平台分界符。同样,让我们假设存储在这个字段的数据只能是如下的数据:Windows NT, Windows 95, Windows 98, Windows, Mac, Unix, 或者 Linux。    下面,我们就可以确认我们需要将哪个字段打印到屏幕上,而要忽略哪些那些字段。或者,我们可以选择哪些字段用一种格式,而另外的字段用其它的格式,如,使用不同的颜色。    使用一个简单的If.,循环就可以给我们提供更多的数据库控制权利。首先让我们来打印有关Windows NT产品的记录:<TABLE BORDER=0 WIDTH=600> <TR><TD COLSPAN=4 ALIGN=CENTER><FONT SIZE="+1"<<B>Windows NT Products</B></FONT></TD></TR> <%  While NOT objRec.EOF  If objRec("OS") = "Windows NT" THEN ' specifies the criteria Response.Write "<TR><TD BGCOLOR=""#FFFF66"">" & objRec("ProductID") & "</TD>"Response.Write "<TD>" & objRec("SKU") & "</TD>" Response.Write "<TD>" & objRec("Name") & "</TD>" Response.Write "<TD>" & objRec("File") & "</TD></TR>"   end if   objRec.MoveNext  Wend%></TABLE>添加一个记录     一旦你开始使用recordset和ASP了,你就会十分希望能够通过网络将数据添加到数据库中去。添加内容是非常重要的,如,当你需要你的网页浏览者留下它们的观点和看法,或者,当你想要进行管理更新的时候。    下面的代码打开了一个recordset,这个recordset是有关一个有着书本和它们作者名字的数据库表格。你可能曾经看到过这个,但是这次,最后三个说明书定义的指针类型是不同的:adOpenStatic, adLockOptimistic, adCmdTable: <%   ' database connection already made; code not shown hereSet objRec = Server.CreateObject ("ADODB.Recordset")  objRec.Open "books", bookdb, adOpenStatic, adLockOptimistic, adCmdTable%>     (如果你没有使用adovbs.inc的复制文件,第三行应该为:objRec.Open "books", bookdb, 3,3,2).     recordset现在就准备好接收数据了,你只需要告诉它添加什么。在这个情况下,假设我们从表格中取出变量:strBookTitle和strBookAuthor。我们的table, books有两个字段,称作Title 和 Author,所以我们可以通过使用下面的语句来添加一个新的记录:<%objRec.AddNew  ObjRec("Title") = strBookTitle  objRec("Author") = strBookAuthor  objRec.Update%>    strBookTitle和strBookAuthor代表值,通常被用户访问。如果你只是想测试add功能,你可以给title和author添加一个变量只是需要记住使用引号。在你第一次使用它的时候,你可能会立即打开你的数据库,以确保更新的发生。Recordset类型      在显示的objRec.Open例子中,你会发现在末尾有0,1,2的字样。这些数字代表不同的指针类型。你是用的类型依赖于你将使用它来干什么。例如,如果你不需要修改或增加任何的记录,你可以使用一个Lock类型。而当你计划要修改或者更新数据库的时候,你所选择的类型就会不同。0,1,2 实际上代表:adOpenForwardOnly, adLockReadOnly, adCmdTable    当然,如果在你的服务器上已经有了adovbs.inc的备份,那么,你也可以不使用数字,直接使用这些单词。adovbs.inc 包括了这三个常量和其它常量的一个列表。Oracle大文本在ASP中存取问题的解决2005-10-27 19:11:43 来源:CSDN 我要投稿本文章地址: 点此复制地址      在我开发BS结构程序中,由于经常需要在ORACLE中处理一些容量较大的文本数据,所以经过反复测试终于用ASP成功解决了大文本数据在ORACLE下存取问题。一、运行环境:1、Microsoft Windows 2000 Server + IIS 5.02、Oracle8i中文标准版二、建立数据表:CREATE TABLE SYSTEM.TEST(BLOB LONG,ID NUMBER)/三、源程序:1、数据存入程序:test.asp%'表单提交处理部分'-If request("ok")=1 then'字符转换函数function tansstr(sstr) sstr=replace(sstr," ","&nbsp;")sstr=replace(sstr,chr(13) & chr(10),"br")tansstr=sstrend function'提交数据赋值a=lenb(request("text")b=len(request("text")c=tansstr(request("text")'打开数据库,打开test数据表以Rs为记录集Set OraSession=CreateObject("OracleInProcServer.XOraSession")Set OraDatabase=OraSession.DbOpenDatabase("autop","system/manager",0)Set rs=OraDatabase.CreateDynaset("select * from test order by id desc",0) '求ID值if rs.eof thenid=1elseid=rs("id")+1end if'因为受SQL语句长度大小限制所以,以非SQL语句存入数据'-'新建记录rs.DbAddNew'经典就在本句:以RS记录集的Fields对象的DbAppendChunk方法处理大字段存入问题。rs.Fields("blob").DbAppendChunk(c)'存入ID值rs("id")=id'刷新记录集rs.DbUpdate'显示结果部分'- Response.write "数据已经存入数据库中。br"Response.write "总计占用字符数: font color=blue" & formatnumber(b,2,-2,-2,-1) & "/font 字br"Response.write "总计占用字节数: font color=blue" & formatnumber(a,2,-2,-2,-1) & "/font Bytebr"Response.write "a href='view.asp'请调阅/a"'关闭数据连接。rs.closeset rs=nothingSet OraSession=nothingResponse.endEnd If%htmlbodyform method="POST" action="test.asp"pfont color="#FF0000"bOracle大字段在ASP中存取问题的解决:/b/font/pptextarea rows="13" name="text" cols="104"/textarea/ppinput type="submit" value="存入" name="B1"/pinput type="hidden" name="ok" value="1"/form/body/html2、数据调出程序:view.asp%'连接数据库,以只读方式打开数据表Set OraSession=CreateObject("OracleInProcServer.XOraSession")Set OraDatabase=OraSession.DbOpenDatabase("autop","system/manager",0)Set Rs=OraDatabase.DbCreateDynaset("select * from test order by id desc",4)'赋初值:定义每次截取字节大小为1024byte,最大可以设为65280byte (64K)Size=65280I=0Do'以Rs记录集的Fields对象的DbGetChunk方法在循环中读出数据Text=Rs.Fields("Blob").DbGetChunk(I*Size,Size)Response.write Text'求出每次取出数据的详细字节数Text_Size=Lenb(Text)I=I+1'如果每次取出数据的详细字节数小于欲定义的截取字节大小则说明该条数据已经完毕,退出循环。 Loop until Text_SizeSize'关闭数据连接Set OraSession=nothing%在ASP中使用Oracle数据库2005-10-27 19:29:59 来源:天极网 我要投稿本文章地址: 点此复制地址Oracle是世界上用得最多的数据库之一,活动服务器网页(ASP)是一种被广泛用于创建动态网页的功能强大的服务器端脚本语言。许多ASP开发人员一直在考虑,能否在开发互联网应用、电子商务网站、互联网管理系统时结合使用ASP和Oracle数据库?这个问题的答案是肯定的,我们还可以使用VB访问Oracle数据库。在本篇文章中,我们将主要讨论如何使用ASP来处理Oracle数据库中数据的方法。 在开始讨论这个问题前,我们需要了解几个背景知识,Oracle Objects for OLE就是其中之一。Oracle Objects for OLE是Oracle开发的一个中间件,它允许使用微软的OLE标准的客户端应用程序访问Oracle的数据库。也许会有读者说,我们也可以使用ODBC访问Oracle的数据库。当然,可以使用ODBC访问Oracle数据库,但我认为,Oracle Objects for OLE比ODBC更安全,而且完全支持PL/SQL。PL/SQL是Oracle对SQL命令集的扩展,开发人员能够利用它对非结构化的SQL命令块进行流控制和逻辑设计。如果安装的是Oracle8i数据库,我相信你已经在使用Oracle Objects for OLE。如果还没有使用Oracle Objects for OLE,可以从Oracle的网站上下载它。 另外,我们还需要了解Oracle针对Visual Basic开发的二个对象和一个接口:OraSession、OraDynaset对象和OraDatabase接口。OraSession对象管理应用程序的OraDatabase、OraConnection和OraDynaset,它是由ASP的CreateObject而不是Oracle Objects for OLE创建的一个对象。OraDatabase接口向Oracle数据库表示表现用户对话,并为SQL、PL/SQL的执行提供方法。它们每个都有一些属性和方法。例如,OraDynaset对象有BOF、EOF、Bookmark、Connection等属性以及AddNew、Update、Delete、Edit、Refresh、Clone等10个方法。 下面我们就开始切入主题,讨论如何使用ASP处理Oracle数据库中的数据。 准备工作 我们需要什么样的环境和工具? 1)我使用了Oracle8i、IIS5.0、Windows2000专业版作为应用程序的开发和运行环境。 2)在Oracle数据库中建立一个名字为MYTABLE1或类似的表。 ID (type: number) User Name(type: varchar2) Phone(type: varchar2) Email(type: varchar2) 100 Colin Tong 999-999-8888 colinjava 111 John White 888-888-8888 johnw 101 Don Wod 416-333-3344 donwod 数据的访问和存取 1) Instantiate OO4O Object, OraSession and interface OraDatabase for connecting to ORACLE. 1)初始化Oracle Objects for OLE、OraSession对象和OraDatabase接口,为连接ORACLE数据库作准备。 首先,使用CreateObject创建OraSession对象,然后通过打开一个与Oracle的连接创建OraDatabase对象,如下所示: % Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase("", _ "username/password", Cint(0) % “username”和“password”是你所使用的关系数据库的用户名和口令。 2)创建OraDynaset对象执行SQL命令。我们可以使用CreateDynaset或DbCreateDynaset创建记录集。 % 'execute SQL Set OraDynaset = OraDatabase.DbCreateDynaset( _ "select * from mytable1", cint(0) % 3)存取数据并删除创建的对象。 % Do While(OraDynaset.EOF = FALSE) Response.write(OraDynaset.Fields("ID") Response.write(OraDynaset.Fields("UserName") . others . . . OraDynaset.MoveNext Loop 'remove OraSession Set OraSession = Nothing % 编辑数据记录 我们将使用OraDynaset的方法实现对数据记录的编辑。 1)使用SQL语句创建OraDynaset对象。 % '创建ID= fID的记录的OraDynaset对象。 Set OraDynaset = OraDatabase.CreateDynaset(_ "select * from MYTABLE1 where ID= "& fID, cint(0) % fID是想插入更更新的记录的ID值。 2)执行OraDynaset更新或添加数据记录。 % '使用Edit方法更新ID=fID记录的域。 '或使用AddNew插入一个新记录 OraDynaset.Edit OraDynaset.Fields("Phone").Value = fPhone OraDynaset.Update ' 删除创建的对话 Set OraSession = Nothing % 删除数据记录 如果已经真正地理解了我们在上面讨论的一些方法(Edit、Update和AddNew),也许有的读者已经知道该如何在Oracle数据库中删除记录了。 % '删除所有符合上面条件的记录 OraDynaset.Delete % 在Oracle8i中搜索和更新数据记录的代码 1)搜索 % 'RetriveRecProc.asp -使用ASP的Oracle Objects for OLE更新数据记录% % '定义作为OLE对象的变量 Dim OraSession Dim OraDatabase Dim OraDynaset'创建OraSession对象 Set OraSession = CreateObject("OracleInProcServer.XOraSession")'通过打开Oracle数据库的一个连接创建OraDatabase对象 '一定要使用自己的用户名和口令访问Oracle数据库 Set OraDatabase = OraSession.OpenDatabase("", "user/password", _ Cint(0) '创建OraDynaset对象执行SQL语句 Set OraDynaset = OraDatabase.DbCreateDynaset(_ "select * from mytable1", cint(0) % htmlbody H3Retrieve All Records in MYTABLE1 Table ( in Oracle) Using oo4o/H3 table border=1 ID="Table1" % Do While(OraDynaset.EOF = FALSE) Response.Write("trtd") Response.write(OraDynaset.Fields("ID") Response.Write("/tdtd") Response.write(OraDynaset.Fields("UserName") Response.Write("/tdtd") Response.write(OraDynaset.Fields("Phone") Response.Write("/tdtd") Response.write(OraDynaset.Fields("Email") Response.Write("/td/tr") OraDynaset.MoveNext Loop '删除OraSession Set OraSession = Nothing % /table a href="javascript:window.history.go(-1)" Back previous Page/a | a href="index.html" Back home Page/a /body/html 2)更新 % 'UpdateRecProc.asp -使用ASP的Oracle Objects for OLE更新数据记录 % % '定义作为OLE对象的变量。 Dim OraSession Dim OraDatabase Dim OraDynaset '从提交的表格中获取字段值 fID = request.form("ID") fUserName = request.form("UserName") fPhone = request.form("Phone") fEmail = request.form("Email") '创建OraSession对象 Set OraSession = CreateObject("OracleInProcServer.XOraSession") '通过打开Oracle数据库的一个连接创建OraDatabase对象 Set OraDatabase = OraSession.OpenDatabase("", "user/password", _ Cint(0) '创建ID= fID的记录的OraDynaset对象 Set OraDynaset = OraDatabase.CreateDynaset(_ "select * from MYTABLE1 where ID= "& fID, cint(0) '使用Edit方法更新ID=fID记录的字段 Do While(OraDynaset.EOF = FALSE) OraDynaset.Edit OraDynaset.Fields("UserName").Value = fUserName OraDynaset.Fields("Phone").Value = fPhone OraDynaset.Fields("Email").Value = fEmail OraDynaset.Update OraDynaset.MoveNext Loop % htmlbody H3Update A Record in MYTABLE1 Table (Oracle) Using oo4o/H3 The record (ID=%=fID%) has been updated successfully!br You can view the result a href="RetrieveAllRec.asp" here/a p a href="javascript:window.history.go(-1)" Back previous Page/a &bnsp;&bnsp; a href="javascript:window.history.go(-2)" Back home Page/a % '删除OraSession对象 Set OraSession = Nothing % /body荆?html 至此,我们已经讨论了如何在ASP代码中使用Oracle Objects for OLE来处理Oracle数据库中的数据。 使用 存储过程 我们已经讨论了如何在ASP中访问Oracle数据库,所有的SQL语句都可以嵌入在ASP网页中。如果在ASP中使用存储过程,将更能够更有效地处理数据。我建议读者除在ASP中嵌入SQL语句外,还应当使用PL/SQL存储过程。在Oracle数据库中创建存储过程已经超出了本文章的范围,在这里就不再进行介绍了。 ASP和Oracle数据库是二种比较流行的技术,都有相当广泛的用户群,如果能够有机地将二者结合起来,将能够给工作带来许多方便,希望这篇文章能够起到抛砖引玉的作用,使读者能够更好地探索将这二种技术结合使用的途径。 随机访问Recordset的一条记录2005-10-27 19:41:12 来源:天极网 我要投稿本文章地址: 点此复制地址    假设这个数据表有一个唯一的ID字段,并至少有一条记录。随机存取其中一条记录的方法是非常简单的,可以分为四步:1、取得记录总数n。2、把所有的ID号存储到一个数组中3、产生一个不大于n的随机数m4、从数组中取出第m个ID号,查询数据表,取得记录数据。下面是部分代码:$#60;% set conn = Server.CreateObject(ADODB.Connection) conn.open $#60;conn string$#62; * (step 1) * set rs = conn.execute(Select count(id) from someTable) rCount = rs(0) * (step 2) * set rs = conn.execute(“select id from someTable”) cnt = 1 dim RRs redim RRs(rCount) do while not rs.eof RRs(cnt) = rs(0) cnt = cnt + 1 rs.movenext loop * (step 3) * randomize currentRR = cLng(rnd*rCount+0.5) ID = RRs(currentRR) * (step 4) * sql = “select otherfield from someTable where id=” & ID set rs = conn.execute(sql) response.write “ID # ” & ID & “ = ” & rs(0) rs.close: set rs = nothing conn.close: set conn = nothing %$#62;对于SQL Server,还有更加有效率的方法。比如设计两个存储过程。我这里只是阐明一些思路,并希望这种思路可以同时用在Access和SQL Server中。ADO 存取数据库时如何分页显示2005-10-27 19:45:17 来源:天极网 我要投稿本文章地址: 点此复制地址    裁词?ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条。想不想了解如何实现分页显示?请看本文!动态网站设计十八般武艺 -ASP 篇一文从第一期至今已和朋友们一起度过了大半个年头,相信通过在这一段时间中的学习、实践到再学习、再实践,大家已经能够熟练运用 ASP 的内建对象、 Act

    注意事项

    本文(第三章+asp数据库编程.doc)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开