简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

ASP动态网页开发中创建数据库表的完整指南从基础语法到实际应用案例详解

3万

主题

349

科技点

3万

积分

大区版主

木柜子打湿

积分
31898

三倍冰淇淋无人之境【一阶】财Doro小樱(小丑装)立华奏以外的星空【二阶】⑨的冰沙

发表于 2025-9-10 15:40:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

ASP(Active Server Pages)是一种微软开发的服务器端脚本环境,用于创建动态交互式网页。在ASP开发中,数据库操作是核心功能之一,而创建数据库表是数据库操作的基础。无论是存储用户信息、产品数据还是其他业务数据,都需要通过数据库表来实现。本文将详细介绍在ASP动态网页开发中如何创建数据库表,从基础语法到实际应用案例,帮助开发者掌握这一重要技能。

ASP与数据库基础

在ASP中,通常使用ADO(ActiveX Data Objects)来连接和操作数据库。ADO是一种微软的技术,用于访问数据源。

连接数据库

在ASP中连接数据库通常需要创建一个连接对象,并使用连接字符串指定数据库的位置和访问方式。
  1. <%
  2. ' 创建连接对象
  3. Set conn = Server.CreateObject("ADODB.Connection")
  4. ' 定义连接字符串
  5. ' 对于Access数据库
  6. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  7. ' 对于SQL Server数据库
  8. ' connStr = "Provider=SQLOLEDB;Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Password=密码"
  9. ' 打开连接
  10. conn.Open connStr
  11. %>
复制代码

执行SQL命令

一旦建立了数据库连接,就可以使用连接对象的Execute方法来执行SQL命令:
  1. <%
  2. ' 执行SQL命令
  3. sql = "SELECT * FROM Users"
  4. Set rs = conn.Execute(sql)
  5. ' 处理结果集...
  6. %>
复制代码

SQL基础语法

SQL(Structured Query Language)是用于管理关系数据库的标准语言。创建表的基本语法如下:
  1. CREATE TABLE table_name (
  2.     column1 datatype constraint,
  3.     column2 datatype constraint,
  4.     ...
  5. );
复制代码

例如,创建一个简单的用户表:
  1. CREATE TABLE Users (
  2.     UserID INT PRIMARY KEY,
  3.     UserName VARCHAR(50) NOT NULL,
  4.     UserEmail VARCHAR(100) UNIQUE,
  5.     UserPassword VARCHAR(50) NOT NULL,
  6.     RegistrationDate DATE DEFAULT GETDATE()
  7. );
复制代码

ASP中创建数据库表的方法

在ASP中,可以通过ADO对象执行SQL CREATE TABLE语句来创建数据库表。

基本方法
  1. <%
  2. ' 创建连接对象
  3. Set conn = Server.CreateObject("ADODB.Connection")
  4. ' 定义连接字符串
  5. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  6. ' 打开连接
  7. conn.Open connStr
  8. ' 定义创建表的SQL语句
  9. sql = "CREATE TABLE Users (" & _
  10.       "UserID COUNTER PRIMARY KEY, " & _
  11.       "UserName VARCHAR(50) NOT NULL, " & _
  12.       "UserEmail VARCHAR(100) UNIQUE, " & _
  13.       "UserPassword VARCHAR(50) NOT NULL, " & _
  14.       "RegistrationDate DATE DEFAULT NOW()" & _
  15.       ")"
  16. ' 执行SQL语句
  17. On Error Resume Next
  18. conn.Execute sql
  19. ' 检查是否出错
  20. If Err.Number <> 0 Then
  21.     Response.Write "创建表时出错: " & Err.Description
  22. Else
  23.     Response.Write "表创建成功!"
  24. End If
  25. ' 关闭连接
  26. conn.Close
  27. Set conn = Nothing
  28. %>
复制代码

使用参数化查询

虽然创建表通常不涉及用户输入,但为了代码的一致性和安全性,可以使用参数化查询的方式:
  1. <%
  2. ' 创建连接对象
  3. Set conn = Server.CreateObject("ADODB.Connection")
  4. ' 定义连接字符串
  5. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  6. ' 打开连接
  7. conn.Open connStr
  8. ' 定义创建表的SQL语句
  9. sql = "CREATE TABLE Products (" & _
  10.       "ID COUNTER PRIMARY KEY, " & _
  11.       "Name VARCHAR(50) NOT NULL, " & _
  12.       "Description MEMO, " & _
  13.       "CreatedDate DATE DEFAULT NOW()" & _
  14.       ")"
  15. ' 创建命令对象
  16. Set cmd = Server.CreateObject("ADODB.Command")
  17. cmd.ActiveConnection = conn
  18. cmd.CommandText = sql
  19. ' 执行命令
  20. On Error Resume Next
  21. cmd.Execute
  22. ' 检查是否出错
  23. If Err.Number <> 0 Then
  24.     Response.Write "创建表时出错: " & Err.Description
  25. Else
  26.     Response.Write "表创建成功!"
  27. End If
  28. ' 关闭连接
  29. conn.Close
  30. Set cmd = Nothing
  31. Set conn = Nothing
  32. %>
复制代码

注意:在实际应用中,表名通常不能作为参数传递,上面的代码仅作为演示。在实际开发中,应该直接在SQL语句中指定表名。

数据类型详解

在创建数据库表时,选择合适的数据类型非常重要。不同的数据库系统支持的数据类型可能有所不同,以下是一些常用的数据类型:

Access数据库常用数据类型

• TEXT或VARCHAR(n):用于存储文本,n指定最大长度
• MEMO:用于存储长文本
• INTEGER或INT:用于存储整数
• COUNTER:自动增长的数字,通常用作主键
• SINGLE或DOUBLE:用于存储浮点数
• CURRENCY:用于存储货币值
• DATE/TIME:用于存储日期和时间
• YES/NO:用于存储布尔值
• OLE OBJECT:用于存储二进制数据

SQL Server常用数据类型

• CHAR(n):固定长度的字符串
• VARCHAR(n):可变长度的字符串
• TEXT:用于存储大量文本
• INT:整数
• BIGINT:大整数
• SMALLINT:小整数
• DECIMAL(p, s):固定精度和小数位的数字
• FLOAT:浮点数
• BIT:布尔值
• DATETIME:日期和时间
• IMAGE:用于存储二进制数据

数据类型选择示例
  1. <%
  2. ' 创建连接对象
  3. Set conn = Server.CreateObject("ADODB.Connection")
  4. ' 定义连接字符串
  5. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  6. ' 打开连接
  7. conn.Open connStr
  8. ' 定义创建表的SQL语句,展示不同数据类型的使用
  9. sql = "CREATE TABLE Products (" & _
  10.       "ProductID COUNTER PRIMARY KEY, " & _
  11.       "ProductName VARCHAR(100) NOT NULL, " & _
  12.       "Description MEMO, " & _
  13.       "Price CURRENCY, " & _
  14.       "StockQuantity INT, " & _
  15.       "IsAvailable YES/NO DEFAULT True, " & _
  16.       "AddedDate DATE DEFAULT NOW(), " & _
  17.       "ProductImage OLE OBJECT" & _
  18.       ")"
  19. ' 执行SQL语句
  20. On Error Resume Next
  21. conn.Execute sql
  22. ' 检查是否出错
  23. If Err.Number <> 0 Then
  24.     Response.Write "创建表时出错: " & Err.Description
  25. Else
  26.     Response.Write "产品表创建成功!"
  27. End If
  28. ' 关闭连接
  29. conn.Close
  30. Set conn = Nothing
  31. %>
复制代码

约束与索引

约束和索引是数据库设计中的重要概念,它们可以保证数据的完整性和提高查询性能。

主键约束

主键是唯一标识表中每一行的列或列组合。一个表只能有一个主键。
  1. <%
  2. sql = "CREATE TABLE Customers (" & _
  3.       "CustomerID COUNTER CONSTRAINT PK_Customers PRIMARY KEY, " & _
  4.       "CustomerName VARCHAR(100) NOT NULL, " & _
  5.       "ContactName VARCHAR(100), " & _
  6.       "Address VARCHAR(200), " & _
  7.       "City VARCHAR(50), " & _
  8.       "PostalCode VARCHAR(20), " & _
  9.       "Country VARCHAR(50)" & _
  10.       ")"
  11. conn.Execute sql
  12. %>
复制代码

外键约束

外键用于建立两个表之间的链接,确保引用完整性。
  1. <%
  2. ' 先创建主表
  3. sql = "CREATE TABLE Categories (" & _
  4.       "CategoryID COUNTER CONSTRAINT PK_Categories PRIMARY KEY, " & _
  5.       "CategoryName VARCHAR(100) NOT NULL, " & _
  6.       "Description MEMO" & _
  7.       ")"
  8. conn.Execute sql
  9. ' 再创建从表,并添加外键约束
  10. sql = "CREATE TABLE Products (" & _
  11.       "ProductID COUNTER CONSTRAINT PK_Products PRIMARY KEY, " & _
  12.       "ProductName VARCHAR(100) NOT NULL, " & _
  13.       "CategoryID INT, " & _
  14.       "Description MEMO, " & _
  15.       "Price CURRENCY, " & _
  16.       "CONSTRAINT FK_Products_Categories FOREIGN KEY (CategoryID) REFERENCES Categories(CategoryID)" & _
  17.       ")"
  18. conn.Execute sql
  19. %>
复制代码

唯一约束

唯一约束确保列中的所有值都是唯一的。
  1. <%
  2. sql = "CREATE TABLE Users (" & _
  3.       "UserID COUNTER CONSTRAINT PK_Users PRIMARY KEY, " & _
  4.       "UserName VARCHAR(50) NOT NULL, " & _
  5.       "UserEmail VARCHAR(100) CONSTRAINT UQ_Users_UserEmail UNIQUE, " & _
  6.       "UserPassword VARCHAR(50) NOT NULL" & _
  7.       ")"
  8. conn.Execute sql
  9. %>
复制代码

检查约束

检查约束用于限制列中的值。
  1. <%
  2. sql = "CREATE TABLE Employees (" & _
  3.       "EmployeeID COUNTER CONSTRAINT PK_Employees PRIMARY KEY, " & _
  4.       "FirstName VARCHAR(50) NOT NULL, " & _
  5.       "LastName VARCHAR(50) NOT NULL, " & _
  6.       "Age INT CONSTRAINT CHK_Employees_Age CHECK (Age >= 18 AND Age <= 70), " & _
  7.       "Salary CURRENCY CONSTRAINT CHK_Employees_Salary CHECK (Salary >= 0)" & _
  8.       ")"
  9. conn.Execute sql
  10. %>
复制代码

默认值约束

默认值约束为列提供默认值。
  1. <%
  2. sql = "CREATE TABLE Orders (" & _
  3.       "OrderID COUNTER CONSTRAINT PK_Orders PRIMARY KEY, " & _
  4.       "CustomerID INT NOT NULL, " & _
  5.       "OrderDate DATE DEFAULT NOW(), " & _
  6.       "ShipDate DATE, " & _
  7.       "Status VARCHAR(20) DEFAULT 'Pending'" & _
  8.       ")"
  9. conn.Execute sql
  10. %>
复制代码

创建索引

索引可以显著提高查询性能。
  1. <%
  2. ' 创建表
  3. sql = "CREATE TABLE Sales (" & _
  4.       "SaleID COUNTER CONSTRAINT PK_Sales PRIMARY KEY, " & _
  5.       "ProductID INT NOT NULL, " & _
  6.       "CustomerID INT NOT NULL, " & _
  7.       "SaleDate DATE NOT NULL, " & _
  8.       "Amount CURRENCY NOT NULL" & _
  9.       ")"
  10. conn.Execute sql
  11. ' 创建索引
  12. sql = "CREATE INDEX IDX_Sales_ProductID ON Sales(ProductID)"
  13. conn.Execute sql
  14. sql = "CREATE INDEX IDX_Sales_CustomerID ON Sales(CustomerID)"
  15. conn.Execute sql
  16. sql = "CREATE INDEX IDX_Sales_SaleDate ON Sales(SaleDate)"
  17. conn.Execute sql
  18. %>
复制代码

实际应用案例

下面是一个完整的示例,展示如何在ASP中创建一个简单的博客系统的数据库表。
  1. <%@ Language=VBScript %>
  2. <%
  3. Option Explicit
  4. ' 错误处理
  5. On Error Resume Next
  6. ' 创建连接对象
  7. Dim conn
  8. Set conn = Server.CreateObject("ADODB.Connection")
  9. ' 定义连接字符串
  10. Dim connStr
  11. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("blog.mdb")
  12. ' 打开连接
  13. conn.Open connStr
  14. ' 检查连接是否成功
  15. If Err.Number <> 0 Then
  16.     Response.Write "数据库连接失败: " & Err.Description
  17.     Response.End
  18. End If
  19. ' 开始创建表
  20. Dim sql
  21. ' 1. 创建用户表
  22. sql = "CREATE TABLE Users (" & _
  23.       "UserID COUNTER CONSTRAINT PK_Users PRIMARY KEY, " & _
  24.       "Username VARCHAR(50) NOT NULL CONSTRAINT UQ_Users_Username UNIQUE, " & _
  25.       "Password VARCHAR(50) NOT NULL, " & _
  26.       "Email VARCHAR(100) CONSTRAINT UQ_Users_Email UNIQUE, " & _
  27.       "FirstName VARCHAR(50), " & _
  28.       "LastName VARCHAR(50), " & _
  29.       "Bio MEMO, " & _
  30.       "Avatar VARCHAR(255), " & _
  31.       "Role VARCHAR(20) DEFAULT 'User', " & _
  32.       "IsActive YES/NO DEFAULT True, " & _
  33.       "CreatedDate DATE DEFAULT NOW(), " & _
  34.       "LastLoginDate DATE" & _
  35.       ")"
  36. conn.Execute sql
  37. If Err.Number <> 0 Then
  38.     Response.Write "创建用户表时出错: " & Err.Description & "<br>"
  39.     Err.Clear
  40. Else
  41.     Response.Write "用户表创建成功!<br>"
  42. End If
  43. ' 2. 创建分类表
  44. sql = "CREATE TABLE Categories (" & _
  45.       "CategoryID COUNTER CONSTRAINT PK_Categories PRIMARY KEY, " & _
  46.       "CategoryName VARCHAR(50) NOT NULL CONSTRAINT UQ_Categories_CategoryName UNIQUE, " & _
  47.       "Description MEMO, " & _
  48.       "ParentCategoryID INT, " & _
  49.       "IsActive YES/NO DEFAULT True, " & _
  50.       "CreatedDate DATE DEFAULT NOW(), " & _
  51.       "CONSTRAINT FK_Categories_Parent FOREIGN KEY (ParentCategoryID) REFERENCES Categories(CategoryID)" & _
  52.       ")"
  53. conn.Execute sql
  54. If Err.Number <> 0 Then
  55.     Response.Write "创建分类表时出错: " & Err.Description & "<br>"
  56.     Err.Clear
  57. Else
  58.     Response.Write "分类表创建成功!<br>"
  59. End If
  60. ' 3. 创建标签表
  61. sql = "CREATE TABLE Tags (" & _
  62.       "TagID COUNTER CONSTRAINT PK_Tags PRIMARY KEY, " & _
  63.       "TagName VARCHAR(50) NOT NULL CONSTRAINT UQ_Tags_TagName UNIQUE, " & _
  64.       "CreatedDate DATE DEFAULT NOW()" & _
  65.       ")"
  66. conn.Execute sql
  67. If Err.Number <> 0 Then
  68.     Response.Write "创建标签表时出错: " & Err.Description & "<br>"
  69.     Err.Clear
  70. Else
  71.     Response.Write "标签表创建成功!<br>"
  72. End If
  73. ' 4. 创建文章表
  74. sql = "CREATE TABLE Posts (" & _
  75.       "PostID COUNTER CONSTRAINT PK_Posts PRIMARY KEY, " & _
  76.       "Title VARCHAR(200) NOT NULL, " & _
  77.       "Content MEMO NOT NULL, " & _
  78.       "Excerpt MEMO, " & _
  79.       "AuthorID INT NOT NULL, " & _
  80.       "CategoryID INT, " & _
  81.       "Status VARCHAR(20) DEFAULT 'Draft', " & _
  82.       "CommentStatus VARCHAR(20) DEFAULT 'Open', " & _
  83.       "IsFeatured YES/NO DEFAULT False, " & _
  84.       "ViewCount INT DEFAULT 0, " & _
  85.       "Slug VARCHAR(200), " & _
  86.       "PublishedDate DATE, " & _
  87.       "CreatedDate DATE DEFAULT NOW(), " & _
  88.       "UpdatedDate DATE, " & _
  89.       "CONSTRAINT FK_Posts_Authors FOREIGN KEY (AuthorID) REFERENCES Users(UserID), " & _
  90.       "CONSTRAINT FK_Posts_Categories FOREIGN KEY (CategoryID) REFERENCES Categories(CategoryID)" & _
  91.       ")"
  92. conn.Execute sql
  93. If Err.Number <> 0 Then
  94.     Response.Write "创建文章表时出错: " & Err.Description & "<br>"
  95.     Err.Clear
  96. Else
  97.     Response.Write "文章表创建成功!<br>"
  98. End If
  99. ' 5. 创建文章标签关联表
  100. sql = "CREATE TABLE PostTags (" & _
  101.       "PostID INT NOT NULL, " & _
  102.       "TagID INT NOT NULL, " & _
  103.       "CONSTRAINT PK_PostTags PRIMARY KEY (PostID, TagID), " & _
  104.       "CONSTRAINT FK_PostTags_Posts FOREIGN KEY (PostID) REFERENCES Posts(PostID), " & _
  105.       "CONSTRAINT FK_PostTags_Tags FOREIGN KEY (TagID) REFERENCES Tags(TagID)" & _
  106.       ")"
  107. conn.Execute sql
  108. If Err.Number <> 0 Then
  109.     Response.Write "创建文章标签关联表时出错: " & Err.Description & "<br>"
  110.     Err.Clear
  111. Else
  112.     Response.Write "文章标签关联表创建成功!<br>"
  113. End If
  114. ' 6. 创建评论表
  115. sql = "CREATE TABLE Comments (" & _
  116.       "CommentID COUNTER CONSTRAINT PK_Comments PRIMARY KEY, " & _
  117.       "PostID INT NOT NULL, " & _
  118.       "UserID INT, " & _
  119.       "AuthorName VARCHAR(100), " & _
  120.       "AuthorEmail VARCHAR(100), " & _
  121.       "AuthorURL VARCHAR(255), " & _
  122.       "AuthorIP VARCHAR(45), " & _
  123.       "Content MEMO NOT NULL, " & _
  124.       "Status VARCHAR(20) DEFAULT 'Pending', " & _
  125.       "ParentCommentID INT, " & _
  126.       "CreatedDate DATE DEFAULT NOW(), " & _
  127.       "CONSTRAINT FK_Comments_Posts FOREIGN KEY (PostID) REFERENCES Posts(PostID), " & _
  128.       "CONSTRAINT FK_Comments_Users FOREIGN KEY (UserID) REFERENCES Users(UserID), " & _
  129.       "CONSTRAINT FK_Comments_Parent FOREIGN KEY (ParentCommentID) REFERENCES Comments(CommentID)" & _
  130.       ")"
  131. conn.Execute sql
  132. If Err.Number <> 0 Then
  133.     Response.Write "创建评论表时出错: " & Err.Description & "<br>"
  134.     Err.Clear
  135. Else
  136.     Response.Write "评论表创建成功!<br>"
  137. End If
  138. ' 7. 创建设置表
  139. sql = "CREATE TABLE Settings (" & _
  140.       "SettingID COUNTER CONSTRAINT PK_Settings PRIMARY KEY, " & _
  141.       "SettingKey VARCHAR(50) NOT NULL CONSTRAINT UQ_Settings_SettingKey UNIQUE, " & _
  142.       "SettingValue MEMO, " & _
  143.       "Description VARCHAR(255), " & _
  144.       "UpdatedDate DATE DEFAULT NOW()" & _
  145.       ")"
  146. conn.Execute sql
  147. If Err.Number <> 0 Then
  148.     Response.Write "创建设置表时出错: " & Err.Description & "<br>"
  149.     Err.Clear
  150. Else
  151.     Response.Write "设置表创建成功!<br>"
  152. End If
  153. ' 创建索引以提高查询性能
  154. ' 文章表索引
  155. sql = "CREATE INDEX IDX_Posts_Status ON Posts(Status)"
  156. conn.Execute sql
  157. If Err.Number <> 0 Then
  158.     Response.Write "创建文章状态索引时出错: " & Err.Description & "<br>"
  159.     Err.Clear
  160. End If
  161. sql = "CREATE INDEX IDX_Posts_AuthorID ON Posts(AuthorID)"
  162. conn.Execute sql
  163. If Err.Number <> 0 Then
  164.     Response.Write "创建文章作者索引时出错: " & Err.Description & "<br>"
  165.     Err.Clear
  166. End If
  167. sql = "CREATE INDEX IDX_Posts_CategoryID ON Posts(CategoryID)"
  168. conn.Execute sql
  169. If Err.Number <> 0 Then
  170.     Response.Write "创建文章分类索引时出错: " & Err.Description & "<br>"
  171.     Err.Clear
  172. End If
  173. sql = "CREATE INDEX IDX_Posts_PublishedDate ON Posts(PublishedDate)"
  174. conn.Execute sql
  175. If Err.Number <> 0 Then
  176.     Response.Write "创建文章发布日期索引时出错: " & Err.Description & "<br>"
  177.     Err.Clear
  178. End If
  179. ' 评论表索引
  180. sql = "CREATE INDEX IDX_Comments_PostID ON Comments(PostID)"
  181. conn.Execute sql
  182. If Err.Number <> 0 Then
  183.     Response.Write "创建评论文章索引时出错: " & Err.Description & "<br>"
  184.     Err.Clear
  185. End If
  186. sql = "CREATE INDEX IDX_Comments_Status ON Comments(Status)"
  187. conn.Execute sql
  188. If Err.Number <> 0 Then
  189.     Response.Write "创建评论状态索引时出错: " & Err.Description & "<br>"
  190.     Err.Clear
  191. End If
  192. sql = "CREATE INDEX IDX_Comments_UserID ON Comments(UserID)"
  193. conn.Execute sql
  194. If Err.Number <> 0 Then
  195.     Response.Write "创建评论用户索引时出错: " & Err.Description & "<br>"
  196.     Err.Clear
  197. End If
  198. ' 关闭连接
  199. conn.Close
  200. Set conn = Nothing
  201. Response.Write "<br>博客数据库表创建完成!"
  202. %>
复制代码

这个示例创建了一个完整的博客系统数据库结构,包括用户表、分类表、标签表、文章表、文章标签关联表、评论表和设置表。每个表都有适当的约束和关系,并创建了必要的索引以提高查询性能。

高级技巧

在ASP中创建数据库表时,还有一些高级技巧可以帮助我们更好地管理数据库结构。

动态创建表

有时我们需要根据用户输入或其他条件动态创建表。
  1. <%
  2. ' 获取表名
  3. Dim tableName
  4. tableName = Request.Form("tableName")
  5. ' 验证表名
  6. If tableName = "" Then
  7.     Response.Write "表名不能为空!"
  8.     Response.End
  9. End If
  10. ' 检查表名是否合法(只允许字母、数字和下划线)
  11. Dim regEx
  12. Set regEx = New RegExp
  13. regEx.Pattern = "^[a-zA-Z0-9_]+$"
  14. If Not regEx.Test(tableName) Then
  15.     Response.Write "表名只能包含字母、数字和下划线!"
  16.     Response.End
  17. End If
  18. ' 创建连接对象
  19. Dim conn
  20. Set conn = Server.CreateObject("ADODB.Connection")
  21. ' 定义连接字符串
  22. Dim connStr
  23. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  24. ' 打开连接
  25. conn.Open connStr
  26. ' 检查表是否已存在
  27. Dim rs
  28. Set rs = conn.OpenSchema(20, Array(Empty, Empty, tableName))
  29. If Not rs.EOF Then
  30.     Response.Write "表 '" & tableName & "' 已存在!"
  31.     rs.Close
  32.     Set rs = Nothing
  33.     conn.Close
  34.     Set conn = Nothing
  35.     Response.End
  36. End If
  37. rs.Close
  38. Set rs = Nothing
  39. ' 动态创建表
  40. Dim sql
  41. sql = "CREATE TABLE [" & tableName & "] (" & _
  42.       "ID COUNTER CONSTRAINT PK_" & tableName & " PRIMARY KEY, " & _
  43.       "Name VARCHAR(100) NOT NULL, " & _
  44.       "Description MEMO, " & _
  45.       "CreatedDate DATE DEFAULT NOW(), " & _
  46.       "IsActive YES/NO DEFAULT True" & _
  47.       ")"
  48. ' 执行SQL语句
  49. On Error Resume Next
  50. conn.Execute sql
  51. ' 检查是否出错
  52. If Err.Number <> 0 Then
  53.     Response.Write "创建表时出错: " & Err.Description
  54. Else
  55.     Response.Write "表 '" & tableName & "' 创建成功!"
  56. End If
  57. ' 关闭连接
  58. conn.Close
  59. Set conn = Nothing
  60. %>
复制代码

修改表结构

有时我们需要在已存在的表上添加、修改或删除列。
  1. <%
  2. ' 创建连接对象
  3. Dim conn
  4. Set conn = Server.CreateObject("ADODB.Connection")
  5. ' 定义连接字符串
  6. Dim connStr
  7. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  8. ' 打开连接
  9. conn.Open connStr
  10. ' 1. 添加新列
  11. Dim sql
  12. sql = "ALTER TABLE Users ADD COLUMN Age INT"
  13. conn.Execute sql
  14. ' 2. 修改列(Access不支持直接修改列,需要创建新列、复制数据、删除旧列、重命名新列)
  15. ' 添加临时列
  16. sql = "ALTER TABLE Users ADD COLUMN TempPassword VARCHAR(100)"
  17. conn.Execute sql
  18. ' 复制数据
  19. sql = "UPDATE Users SET TempPassword = Password"
  20. conn.Execute sql
  21. ' 删除旧列
  22. sql = "ALTER TABLE Users DROP COLUMN Password"
  23. conn.Execute sql
  24. ' 重命名临时列(Access不支持直接重命名列,需要使用ADOX)
  25. %>
  26. <!--#include file="adovbs.inc"-->
  27. <%
  28. Dim cat
  29. Set cat = Server.CreateObject("ADOX.Catalog")
  30. cat.ActiveConnection = conn
  31. ' 重命名列
  32. cat.Tables("Users").Columns("TempPassword").Name = "Password"
  33. ' 清理
  34. Set cat = Nothing
  35. ' 3. 删除列
  36. sql = "ALTER TABLE Users DROP COLUMN Age"
  37. conn.Execute sql
  38. ' 关闭连接
  39. conn.Close
  40. Set conn = Nothing
  41. Response.Write "表结构修改完成!"
  42. %>
复制代码

创建存储过程(SQL Server)

如果使用SQL Server数据库,可以创建存储过程来封装创建表的逻辑。
  1. <%
  2. ' 创建连接对象
  3. Dim conn
  4. Set conn = Server.CreateObject("ADODB.Connection")
  5. ' 定义连接字符串
  6. Dim connStr
  7. connStr = "Provider=SQLOLEDB;Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Password=密码"
  8. ' 打开连接
  9. conn.Open connStr
  10. ' 创建存储过程
  11. Dim sql
  12. sql = "CREATE PROCEDURE sp_CreateUserTable " & _
  13.       "@TableName VARCHAR(50), " & _
  14.       "@HasEmail BIT = 1, " & _
  15.       "@HasPhone BIT = 0 " & _
  16.       "AS " & _
  17.       "BEGIN " & _
  18.       "    DECLARE @SQL NVARCHAR(4000) " & _
  19.       "    SET @SQL = 'CREATE TABLE ' + QUOTENAME(@TableName) + ' (' " & _
  20.       "    SET @SQL = @SQL + 'UserID INT IDENTITY(1,1) PRIMARY KEY, ' " & _
  21.       "    SET @SQL = @SQL + 'UserName VARCHAR(50) NOT NULL, ' " & _
  22.       "    SET @SQL = @SQL + 'UserPassword VARCHAR(50) NOT NULL' "
  23. sql = sql & "    IF @HasEmail = 1 " & _
  24.            "        SET @SQL = @SQL + ', UserEmail VARCHAR(100)' " & _
  25.            "    IF @HasPhone = 1 " & _
  26.            "        SET @SQL = @SQL + ', UserPhone VARCHAR(20)' " & _
  27.            "    SET @SQL = @SQL + ', CreatedDate DATETIME DEFAULT GETDATE())' " & _
  28.            "    EXEC sp_executesql @SQL " & _
  29.            "END"
  30. ' 执行SQL语句
  31. conn.Execute sql
  32. ' 使用存储过程创建表
  33. Dim cmd
  34. Set cmd = Server.CreateObject("ADODB.Command")
  35. cmd.ActiveConnection = conn
  36. cmd.CommandText = "sp_CreateUserTable"
  37. cmd.CommandType = adCmdStoredProc
  38. ' 添加参数
  39. cmd.Parameters.Append cmd.CreateParameter("@TableName", adVarChar, adParamInput, 50, "Customers")
  40. cmd.Parameters.Append cmd.CreateParameter("@HasEmail", adBoolean, adParamInput, , True)
  41. cmd.Parameters.Append cmd.CreateParameter("@HasPhone", adBoolean, adParamInput, , True)
  42. ' 执行存储过程
  43. cmd.Execute
  44. ' 清理
  45. Set cmd = Nothing
  46. conn.Close
  47. Set conn = Nothing
  48. Response.Write "存储过程创建完成,并已使用存储过程创建表!"
  49. %>
复制代码

常见问题与解决方案

在ASP中创建数据库表时,可能会遇到一些常见问题。以下是一些问题及其解决方案:

问题1:权限不足

问题描述:执行CREATE TABLE语句时,出现”权限不足”错误。

解决方案:
  1. <%
  2. ' 检查数据库文件是否有写入权限
  3. Dim fso, dbFile
  4. Set fso = Server.CreateObject("Scripting.FileSystemObject")
  5. dbFile = Server.MapPath("database.mdb")
  6. If Not fso.FileExists(dbFile) Then
  7.     ' 如果数据库文件不存在,尝试创建
  8.     On Error Resume Next
  9.     Set dbFile = fso.CreateTextFile(dbFile)
  10.     If Err.Number <> 0 Then
  11.         Response.Write "无法创建数据库文件,请检查目录权限: " & Err.Description
  12.         Response.End
  13.     End If
  14.     dbFile.Close
  15. End If
  16. ' 检查是否有写入权限
  17. On Error Resume Next
  18. Set dbFile = fso.OpenTextFile(dbFile, 8, True) ' 8 = ForAppending
  19. If Err.Number <> 0 Then
  20.     Response.Write "没有数据库文件的写入权限,请联系管理员: " & Err.Description
  21.     Response.End
  22. End If
  23. dbFile.Close
  24. Set fso = Nothing
  25. ' 现在可以安全地创建表
  26. Dim conn
  27. Set conn = Server.CreateObject("ADODB.Connection")
  28. conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  29. ' 创建表的代码...
  30. %>
复制代码

问题2:表已存在

问题描述:尝试创建已存在的表,导致错误。

解决方案:
  1. <%
  2. ' 创建连接对象
  3. Dim conn
  4. Set conn = Server.CreateObject("ADODB.Connection")
  5. ' 定义连接字符串
  6. Dim connStr
  7. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  8. ' 打开连接
  9. conn.Open connStr
  10. ' 检查表是否已存在
  11. Function TableExists(tableName)
  12.     Dim rs
  13.     Set rs = conn.OpenSchema(20, Array(Empty, Empty, tableName))
  14.     If Not rs.EOF Then
  15.         TableExists = True
  16.     Else
  17.         TableExists = False
  18.     End If
  19.     rs.Close
  20.     Set rs = Nothing
  21. End Function
  22. ' 尝试创建表
  23. Dim tableName
  24. tableName = "Users"
  25. If TableExists(tableName) Then
  26.     Response.Write "表 '" & tableName & "' 已存在!"
  27. Else
  28.     Dim sql
  29.     sql = "CREATE TABLE " & tableName & " (" & _
  30.           "UserID COUNTER PRIMARY KEY, " & _
  31.           "UserName VARCHAR(50) NOT NULL, " & _
  32.           "UserEmail VARCHAR(100) UNIQUE, " & _
  33.           "UserPassword VARCHAR(50) NOT NULL" & _
  34.           ")"
  35.    
  36.     On Error Resume Next
  37.     conn.Execute sql
  38.    
  39.     If Err.Number <> 0 Then
  40.         Response.Write "创建表时出错: " & Err.Description
  41.     Else
  42.         Response.Write "表 '" & tableName & "' 创建成功!"
  43.     End If
  44. End If
  45. ' 关闭连接
  46. conn.Close
  47. Set conn = Nothing
  48. %>
复制代码

问题3:SQL注入攻击

问题描述:使用用户输入作为表名或列名时,可能导致SQL注入攻击。

解决方案:
  1. <%
  2. ' 获取用户输入
  3. Dim tableName
  4. tableName = Request.Form("tableName")
  5. ' 验证表名
  6. Function IsValidTableName(name)
  7.     ' 表名只能包含字母、数字和下划线,且必须以字母开头
  8.     Dim regEx
  9.     Set regEx = New RegExp
  10.     regEx.Pattern = "^[a-zA-Z][a-zA-Z0-9_]*$"
  11.     IsValidTableName = regEx.Test(name)
  12. End Function
  13. ' 检查是否为SQL保留字
  14. Function IsReservedWord(word)
  15.     Dim reservedWords
  16.     reservedWords = Array("SELECT", "INSERT", "UPDATE", "DELETE", "DROP", "CREATE", "ALTER", "TABLE", "FROM", "WHERE", "AND", "OR", "NOT", "IN", "LIKE", "BETWEEN", "JOIN", "INNER", "OUTER", "LEFT", "RIGHT", "FULL", "UNION", "GROUP", "ORDER", "BY", "HAVING", "DISTINCT", "COUNT", "SUM", "AVG", "MIN", "MAX", "AS", "ON", "SET", "VALUES", "INTO", "PRIMARY", "KEY", "FOREIGN", "REFERENCES", "CONSTRAINT", "DEFAULT", "NULL", "NOT", "UNIQUE", "INDEX", "VIEW", "TRIGGER", "PROCEDURE", "FUNCTION", "DATABASE", "USER", "PASSWORD", "GRANT", "REVOKE", "COMMIT", "ROLLBACK", "TRANSACTION")
  17.    
  18.     Dim i
  19.     For i = LBound(reservedWords) To UBound(reservedWords)
  20.         If UCase(word) = reservedWords(i) Then
  21.             IsReservedWord = True
  22.             Exit Function
  23.         End If
  24.     Next
  25.    
  26.     IsReservedWord = False
  27. End Function
  28. If Not IsValidTableName(tableName) Then
  29.     Response.Write "无效的表名! 表名只能包含字母、数字和下划线,且必须以字母开头。"
  30.     Response.End
  31. End If
  32. If IsReservedWord(tableName) Then
  33.     Response.Write "表名不能是SQL保留字!"
  34.     Response.End
  35. End If
  36. ' 创建连接对象
  37. Dim conn
  38. Set conn = Server.CreateObject("ADODB.Connection")
  39. ' 定义连接字符串
  40. Dim connStr
  41. connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  42. ' 打开连接
  43. conn.Open connStr
  44. ' 安全地创建表
  45. Dim sql
  46. sql = "CREATE TABLE [" & tableName & "] (" & _
  47.       "ID COUNTER PRIMARY KEY, " & _
  48.       "Name VARCHAR(100) NOT NULL, " & _
  49.       "Description MEMO, " & _
  50.       "CreatedDate DATE DEFAULT NOW()" & _
  51.       ")"
  52. ' 执行SQL语句
  53. On Error Resume Next
  54. conn.Execute sql
  55. ' 检查是否出错
  56. If Err.Number <> 0 Then
  57.     Response.Write "创建表时出错: " & Err.Description
  58. Else
  59.     Response.Write "表 '" & tableName & "' 创建成功!"
  60. End If
  61. ' 关闭连接
  62. conn.Close
  63. Set conn = Nothing
  64. %>
复制代码

问题4:数据库版本兼容性

问题描述:不同版本的Access或SQL Server可能支持不同的SQL语法和数据类型。

解决方案:
  1. <%
  2. ' 创建连接对象
  3. Dim conn
  4. Set conn = Server.CreateObject("ADODB.Connection")
  5. ' 检测数据库类型和版本
  6. Function GetDatabaseType()
  7.     On Error Resume Next
  8.    
  9.     ' 尝试连接Access数据库
  10.     Dim connStr
  11.     connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  12.     conn.Open connStr
  13.    
  14.     If Err.Number = 0 Then
  15.         GetDatabaseType = "Access"
  16.         conn.Close
  17.         Exit Function
  18.     End If
  19.    
  20.     ' 尝试连接SQL Server数据库
  21.     Err.Clear
  22.     connStr = "Provider=SQLOLEDB;Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Password=密码"
  23.     conn.Open connStr
  24.    
  25.     If Err.Number = 0 Then
  26.         GetDatabaseType = "SQLServer"
  27.         conn.Close
  28.         Exit Function
  29.     End If
  30.    
  31.     GetDatabaseType = "Unknown"
  32. End Function
  33. ' 根据数据库类型创建表
  34. Dim dbType
  35. dbType = GetDatabaseType()
  36. If dbType = "Unknown" Then
  37.     Response.Write "无法连接到任何支持的数据库!"
  38.     Response.End
  39. End If
  40. ' 重新打开连接
  41. If dbType = "Access" Then
  42.     conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("database.mdb")
  43. ElseIf dbType = "SQLServer" Then
  44.     conn.Open "Provider=SQLOLEDB;Data Source=服务器名;Initial Catalog=数据库名;User ID=用户名;Password=密码"
  45. End If
  46. ' 根据数据库类型生成不同的SQL
  47. Dim sql
  48. If dbType = "Access" Then
  49.     sql = "CREATE TABLE Users (" & _
  50.           "UserID COUNTER PRIMARY KEY, " & _
  51.           "UserName VARCHAR(50) NOT NULL, " & _
  52.           "UserEmail VARCHAR(100) UNIQUE, " & _
  53.           "UserPassword VARCHAR(50) NOT NULL, " & _
  54.           "RegistrationDate DATE DEFAULT NOW()" & _
  55.           ")"
  56. ElseIf dbType = "SQLServer" Then
  57.     sql = "CREATE TABLE Users (" & _
  58.           "UserID INT IDENTITY(1,1) PRIMARY KEY, " & _
  59.           "UserName VARCHAR(50) NOT NULL, " & _
  60.           "UserEmail VARCHAR(100) UNIQUE, " & _
  61.           "UserPassword VARCHAR(50) NOT NULL, " & _
  62.           "RegistrationDate DATETIME DEFAULT GETDATE()" & _
  63.           ")"
  64. End If
  65. ' 执行SQL语句
  66. On Error Resume Next
  67. conn.Execute sql
  68. ' 检查是否出错
  69. If Err.Number <> 0 Then
  70.     Response.Write "创建表时出错: " & Err.Description
  71. Else
  72.     Response.Write "表创建成功! 数据库类型: " & dbType
  73. End If
  74. ' 关闭连接
  75. conn.Close
  76. Set conn = Nothing
  77. %>
复制代码

总结与最佳实践

在ASP动态网页开发中创建数据库表是一个基础而重要的任务。通过本文的介绍,我们了解了从基础语法到实际应用案例的完整过程。以下是一些总结和最佳实践:

总结

1. 连接数据库:使用ADO对象连接数据库是ASP中操作数据库的基础。
2. SQL语法:掌握CREATE TABLE语句及其相关语法是创建数据库表的关键。
3. 数据类型:选择合适的数据类型对于数据库性能和数据完整性至关重要。
4. 约束和索引:合理使用约束可以保证数据完整性,使用索引可以提高查询性能。
5. 错误处理:在ASP代码中实现适当的错误处理可以提高应用程序的健壮性。

最佳实践

1. 命名规范:使用一致的命名规范,如表名使用单数形式,列名使用驼峰命名法。
2. 安全性:始终验证用户输入,防止SQL注入攻击。
3. 错误处理:实现全面的错误处理,提供有意义的错误信息。
4. 代码重用:将常用的数据库操作封装为函数或类,提高代码重用性。
5. 文档记录:为数据库结构和代码添加详细的注释和文档。
6. 备份:在修改数据库结构之前,始终备份现有数据。
7. 版本控制:使用版本控制系统跟踪数据库结构的变化。
8. 性能考虑:根据应用需求合理设计表结构和索引。

示例:最佳实践实现
  1. <%@ Language=VBScript %>
  2. <%
  3. Option Explicit
  4. ' 错误处理
  5. On Error Resume Next
  6. ' 数据库操作类
  7. Class DatabaseManager
  8.     Private conn
  9.    
  10.     Private Sub Class_Initialize()
  11.         Set conn = Server.CreateObject("ADODB.Connection")
  12.     End Sub
  13.    
  14.     Private Sub Class_Terminate()
  15.         If Not (conn Is Nothing) Then
  16.             If conn.State = 1 Then conn.Close
  17.             Set conn = Nothing
  18.         End If
  19.     End Sub
  20.    
  21.     ' 连接数据库
  22.     Public Function Connect(dbType, dbPath, serverName, dbName, userId, password)
  23.         Dim connStr
  24.         
  25.         Select Case LCase(dbType)
  26.             Case "access"
  27.                 connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(dbPath)
  28.             Case "sqlserver"
  29.                 connStr = "Provider=SQLOLEDB;Data Source=" & serverName & ";Initial Catalog=" & dbName & ";User ID=" & userId & ";Password=" & password
  30.             Case Else
  31.                 Connect = False
  32.                 Exit Function
  33.         End Select
  34.         
  35.         conn.Open connStr
  36.         
  37.         If Err.Number <> 0 Then
  38.             Connect = False
  39.             Err.Clear
  40.         Else
  41.             Connect = True
  42.         End If
  43.     End Function
  44.    
  45.     ' 检查表是否存在
  46.     Public Function TableExists(tableName)
  47.         Dim rs
  48.         Set rs = conn.OpenSchema(20, Array(Empty, Empty, tableName))
  49.         
  50.         If Not rs.EOF Then
  51.             TableExists = True
  52.         Else
  53.             TableExists = False
  54.         End If
  55.         
  56.         rs.Close
  57.         Set rs = Nothing
  58.     End Function
  59.    
  60.     ' 创建表
  61.     Public Function CreateTable(tableName, columns)
  62.         If TableExists(tableName) Then
  63.             CreateTable = False
  64.             Exit Function
  65.         End If
  66.         
  67.         Dim sql, i
  68.         sql = "CREATE TABLE [" & tableName & "] ("
  69.         
  70.         For i = LBound(columns) To UBound(columns)
  71.             sql = sql & columns(i).Name & " " & columns(i).DataType
  72.             
  73.             If columns(i).Size > 0 Then
  74.                 sql = sql & "(" & columns(i).Size & ")"
  75.             End If
  76.             
  77.             If columns(i).Nullable = False Then
  78.                 sql = sql & " NOT NULL"
  79.             End If
  80.             
  81.             If columns(i).DefaultValue <> "" Then
  82.                 sql = sql & " DEFAULT " & columns(i).DefaultValue
  83.             End If
  84.             
  85.             If columns(i).IsPrimaryKey Then
  86.                 sql = sql & " PRIMARY KEY"
  87.             End If
  88.             
  89.             If i < UBound(columns) Then
  90.                 sql = sql & ", "
  91.             End If
  92.         Next
  93.         
  94.         sql = sql & ")"
  95.         
  96.         conn.Execute sql
  97.         
  98.         If Err.Number <> 0 Then
  99.             CreateTable = False
  100.             Err.Clear
  101.         Else
  102.             CreateTable = True
  103.         End If
  104.     End Function
  105.    
  106.     ' 执行SQL
  107.     Public Function ExecuteSQL(sql)
  108.         conn.Execute sql
  109.         
  110.         If Err.Number <> 0 Then
  111.             ExecuteSQL = False
  112.             Err.Clear
  113.         Else
  114.             ExecuteSQL = True
  115.         End If
  116.     End Function
  117. End Class
  118. ' 列定义类
  119. Class ColumnDefinition
  120.     Public Name
  121.     Public DataType
  122.     Public Size
  123.     Public Nullable
  124.     Public DefaultValue
  125.     Public IsPrimaryKey
  126.    
  127.     Private Sub Class_Initialize()
  128.         Size = 0
  129.         Nullable = True
  130.         DefaultValue = ""
  131.         IsPrimaryKey = False
  132.     End Sub
  133. End Class
  134. ' 使用示例
  135. Dim db, columns(4), col, i
  136. ' 创建数据库管理器
  137. Set db = New DatabaseManager
  138. ' 连接数据库
  139. If Not db.Connect("Access", "database.mdb", "", "", "", "") Then
  140.     Response.Write "数据库连接失败!"
  141.     Response.End
  142. End If
  143. ' 定义列
  144. For i = 0 To 4
  145.     Set col = New ColumnDefinition
  146.     Set columns(i) = col
  147. Next
  148. ' 设置列属性
  149. columns(0).Name = "UserID"
  150. columns(0).DataType = "COUNTER"
  151. columns(0).IsPrimaryKey = True
  152. columns(1).Name = "UserName"
  153. columns(1).DataType = "VARCHAR"
  154. columns(1).Size = 50
  155. columns(1).Nullable = False
  156. columns(2).Name = "UserEmail"
  157. columns(2).DataType = "VARCHAR"
  158. columns(2).Size = 100
  159. columns(3).Name = "UserPassword"
  160. columns(3).DataType = "VARCHAR"
  161. columns(3).Size = 50
  162. columns(3).Nullable = False
  163. columns(4).Name = "RegistrationDate"
  164. columns(4).DataType = "DATE"
  165. columns(4).DefaultValue = "NOW()"
  166. ' 创建表
  167. If db.CreateTable("Users", columns) Then
  168.     Response.Write "表创建成功!"
  169. Else
  170.     Response.Write "表创建失败!"
  171. End If
  172. ' 清理
  173. Set db = Nothing
  174. For i = 0 To 4
  175.     Set columns(i) = Nothing
  176. Next
  177. %>
复制代码

这个示例展示了如何使用面向对象的方式封装数据库操作,使代码更加模块化和可重用。通过这种方式,我们可以更轻松地管理数据库操作,减少错误,并提高代码的可维护性。

总之,在ASP动态网页开发中创建数据库表是一项基础而重要的任务。通过掌握基础语法、理解数据类型、约束和索引的使用,以及遵循最佳实践,我们可以设计出高效、安全和可维护的数据库结构,为Web应用程序提供强大的数据支持。
回复

使用道具 举报

0

主题

645

科技点

436

积分

候风辨气

积分
436
发表于 2025-9-10 16:32:17 | 显示全部楼层
感謝分享
温馨提示:看帖回帖是一种美德,您的每一次发帖、回帖都是对论坛最大的支持,谢谢! [这是默认签名,点我更换签名]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.