对数据频繁修改 *** 作的话 是使用XML还是数据库

对数据频繁修改 *** 作的话 是使用XML还是数据库,第1张

繁修改 *** 作的话, 还是数据库。因为 XML 文件的话, 一保存, 就是整个文件一起保存的。而不是修改一点,保存一点的。不过你这种 论坛帖子 类型的嘛, 用 关系型数据库, 效果也不理想。可以尝试使用 文档型数据库, 例如 MongoDB 那种类型的。

不太懂你问题的意思,按照我的理解说一下吧,希望对你有帮助

第一步:用程序解析

XML文件

第二部:将读取的文件字段,定义为几个参数,然后传入掺入数据可函数:

如:String

column1

=

文件字段1;String

column2

=

文件字段2;

String

column3=

文件字段3;(可以集合传参)

将上述字段作为参数,传入函数即可:

insertDB(String

column1,String

column2,String

column3){

String

sql

=

"insert

tableName("+column1+","+column3")

values

(value1,value2)"

}

读XML的速度没有读数据库快

下面的是discuz中的的方法,你看看行不行

public abstract class XMLComponent

{

//源数据表

private DataTable sourceDT = null;

public DataTable SourceDataTable

{

set{sourceDT = value;}

get{return sourceDT;}

}

//文件输出路径

private string fileOutputPath = @"";

public string FileOutPath

{

set

{ //保证路径字符串变量的合法性

if (valueLastIndexOf("\\") != (valueLength-1))

fileOutputPath = value + "\\";

}

get{return fileOutputPath;}

}

//文件编码

private string fileEncode = "utf-8";

public string FileEncode

{

set{fileEncode = value;}

get{return fileEncode;}

}

//文件缩进

private int indentation = 6;

public int Indentation

{

set{indentation = value;}

get{return indentation;}

}

//文件缩进

private string version = "20";

public string Version

{

set{version = value;}

get{return version;}

}

//开始元素

private string startElement = "channel";

public string StartElement

{

set{startElement = value;}

get{return startElement;}

}

//XSL链接

private string xslLink = null;

public string XslLink

{

set{xslLink = value;}

get{return xslLink;}

}

//文件名

private string fileName = "MyFilexml";

public string FileName

{

set{fileName = value;}

get{return fileName;}

}

//表中指向父记录的字段名称

private string parentField = "Item";

public string ParentField

{

set{parentField = value;}

get{return parentField;}

}

//表中一个主键的值

private string key = "ItemID";

public string Key

{

set{key = value;}

get{return key;}

}

//写入文件

public abstract string WriteFile();

//写入StringBuilder对象

public abstract StringBuilder WriteStringBuilder();

public XmlDocument xmlDoc_Metone = new XmlDocument();

#region 构XML树

protected void BulidXmlTree(XmlElement tempXmlElement,string location)

{

DataRow tempRow = thisSourceDataTableSelect(thisKey + "=" + location)[0];

//生成Tree节点

XmlElement treeElement = xmlDoc_MetoneCreateElement(thisParentField);

tempXmlElementAppendChild(treeElement);

foreach(DataColumn c in thisSourceDataTableColumns) //依次找出当前记录的所有列属性

{

if ((cCaptionToString()ToLower() != thisParentFieldToLower()))

thisAppendChildElement(cCaptionToString()Trim()ToLower(),tempRow[cCaptionTrim()]ToString()Trim(),treeElement);

}

foreach (DataRow dr in thisSourceDataTableSelect(thisParentField + "=" + location))

{

if(thisSourceDataTableSelect("item=" + dr[thisKey]ToString())Length >= 0)

{

thisBulidXmlTree(treeElement,dr[thisKey]ToString()Trim());

}

else continue;

}

}

#endregion

#region 追加子节点

/// <summary>

/// 追加子节点

/// </summary>

/// <param name="strName">节点名字</param>

/// <param name="strInnerText">节点内容</param>

/// <param name="parentElement">父节点</param>

/// <param name="xmlDocument">XmlDocument对象</param>

protected void AppendChildElement(string strName , string strInnerText , XmlElement parentElement, XmlDocument xmlDocument )

{

XmlElement xmlElement = xmlDocumentCreateElement(strName) ;

xmlElementInnerText = strInnerText ;

parentElementAppendChild(xmlElement);

}

/// <summary>

/// 使用默认的频道Xml文档

/// </summary>

/// <param name="strName"></param>

/// <param name="strInnerText"></param>

/// <param name="parentElement"></param>

protected void AppendChildElement(string strName , string strInnerText , XmlElement parentElement )

{

AppendChildElement(strName,strInnerText,parentElement,xmlDoc_Metone);

}

#endregion

#region 创建存储生成XML的文件夹

public void CreatePath()

{

if (thisFileOutPath != null)

{

string path = thisFileOutPath; //;ServerMapPath("");

if (!DirectoryExists(path))

{

UtilsCreateDir(path);

}

}

else

{

string path = @"C:\"; //;ServerMapPath("");

string NowString = DateTimeNowToString("yyyy-M")Trim();

if (!DirectoryExists(path + NowString))

{

UtilsCreateDir(path + "\\" + NowString);

}

}

}

#endregion

}

//无递归直接生成XML

class ConcreteComponent : XMLComponent

{

private string strName;

public ConcreteComponent(string s)

{

strName = s;

}

//写入StringBuilder对象

public override StringBuilder WriteStringBuilder()

{

//string xmlData = stringFormat("<xml version='10' encoding='{0}'><xml-stylesheet type=\"text/xsl\" href=\"{1}\"><{3} version='{2}'></{3}>",thisFileEncode,thisXslLink,thisVersion,thisSourceDataTableTableName);

string xmlData = stringFormat("<xml version='10' encoding='{0}'><{3} ></{3}>",thisFileEncode,thisXslLink,thisVersion,thisSourceDataTableTableName);

thisxmlDoc_MetoneLoad(new StringReader(xmlData));

//写入channel

foreach(DataRow r in thisSourceDataTableRows) //依次取出所有行

{

//普通方式生成XML

XmlElement treeContentElement = thisxmlDoc_MetoneCreateElement(thisStartElement);

xmlDoc_MetoneDocumentElementAppendChild(treeContentElement);

foreach(DataColumn c in thisSourceDataTableColumns) //依次找出当前记录的所有列属性

{

thisAppendChildElement(cCaptionToString()ToLower(),r[c]ToString()Trim(),treeContentElement);

}

}

return new StringBuilder()Append(xmlDoc_MetoneInnerXml);

}

public override string WriteFile()

{

if (thisSourceDataTable != null)

{

DateTime filenamedate = DateTimeNow;

string filename = thisFileOutPath + thisFileName;

XmlTextWriter PicXmlWriter = null;

Encoding encode = EncodingGetEncoding(thisFileEncode);

CreatePath();

PicXmlWriter = new XmlTextWriter (filename,encode);

try

{

PicXmlWriterFormatting = FormattingIndented;

PicXmlWriterIndentation = thisIndentation;

PicXmlWriterNamespaces = false;

PicXmlWriterWriteStartDocument();

//PicXmlWriterWriteDocType("文档类型", null, "xml", null);

//PicXmlWriterWriteComment("按在数据库中记录的ID进行记录读写");

PicXmlWriterWriteProcessingInstruction("xml-stylesheet","type='text/xsl' href='" + thisXslLink + "'") ;

PicXmlWriterWriteStartElement(thisSourceDataTableTableName);

PicXmlWriterWriteAttributeString("", "version", null, thisVersion);

//写入channel

foreach(DataRow r in thisSourceDataTableRows) //依次取出所有行

{

PicXmlWriterWriteStartElement("",thisStartElement,"");

foreach(DataColumn c in thisSourceDataTableColumns) //依次找出当前记录的所有列属性

{

PicXmlWriterWriteStartElement("",cCaptionToString()Trim()ToLower(),"");

PicXmlWriterWriteString(r[c]ToString()Trim());

PicXmlWriterWriteEndElement();

}

PicXmlWriterWriteEndElement();

}

PicXmlWriterWriteEndElement();

PicXmlWriterFlush();

thisSourceDataTableDispose();

}

catch (Exception e) { ConsoleWriteLine ("异常:{0}", eToString()); }

finally

{

ConsoleWriteLine("对文件 {0} 的处理已完成。");

if (PicXmlWriter != null)

PicXmlWriterClose();

}

return filename;

}

else

{

ConsoleWriteLine("对文件 {0} 的处理未完成。");

return "";

}

}

}

//无递归直接生成XML

public class TreeNodeComponent : XMLComponent

{

private string strName;

public TreeNodeComponent(string s)

{

strName = s;

}

//写入StringBuilder对象

public override StringBuilder WriteStringBuilder()

{

//string xmlData = stringFormat("<xml version='10' encoding='{0}'><xml-stylesheet type=\"text/xsl\" href=\"{1}\"><{3} version='{2}'></{3}>",thisFileEncode,thisXslLink,thisVersion,thisSourceDataTableTableName);

string xmlData = stringFormat("<xml version='10' encoding='{0}'><{3} ></{3}>",thisFileEncode,thisXslLink,thisVersion,thisSourceDataTableTableName);

thisxmlDoc_MetoneLoad(new StringReader(xmlData));

//写入channel

foreach(DataRow r in thisSourceDataTableRows) //依次取出所有行

{

//普通方式生成XML

XmlElement treeContentElement = thisxmlDoc_MetoneCreateElement(thisStartElement);

xmlDoc_MetoneDocumentElementAppendChild(treeContentElement);

foreach(DataColumn c in thisSourceDataTableColumns) //依次找出当前记录的所有列属性

{

thisAppendChildElement(cCaptionToString()ToLower(),r[c]ToString()Trim(),treeContentElement);

}

}

return new StringBuilder()Append(xmlDoc_MetoneInnerXml);

}

public override string WriteFile()

{

if (thisSourceDataTable != null)

{

DateTime filenamedate = DateTimeNow;

string filename = thisFileOutPath + thisFileName;

XmlTextWriter PicXmlWriter = null;

Encoding encode = EncodingGetEncoding(thisFileEncode);

CreatePath();

PicXmlWriter = new XmlTextWriter (filename,encode);

try

{

PicXmlWriterFormatting = FormattingIndented;

PicXmlWriterIndentation = thisIndentation;

PicXmlWriterNamespaces = false;

PicXmlWriterWriteStartDocument();

//PicXmlWriterWriteDocType("文档类型", null, "xml", null);

//PicXmlWriterWriteComment("按在数据库中记录的ID进行记录读写");

PicXmlWriterWriteStartElement(thisSourceDataTableTableName);

string content = null;

//写入channel

foreach(DataRow r in thisSourceDataTableRows) //依次取出所有行

{

content = " Text=\"" + r[0]ToString()Trim() + "\" ImageUrl=\"//editor/images/smilies/" + r[1]ToString()Trim() + "\"";

PicXmlWriterWriteStartElement("",thisStartElement+content,"");

PicXmlWriterWriteEndElement();

content = null;

}

PicXmlWriterWriteEndElement();

PicXmlWriterFlush();

thisSourceDataTableDispose();

}

catch (Exception e)

{

ConsoleWriteLine ("异常:{0}", eToString());

}

finally

{

ConsoleWriteLine("对文件 {0} 的处理已完成。");

if (PicXmlWriter != null)

PicXmlWriterClose();

}

return filename;

}

else

{

ConsoleWriteLine("对文件 {0} 的处理未完成。");

return "";

}

}

}

//RSS生成

public class RssXMLComponent : XMLComponent

{

private string strName;

public RssXMLComponent(string s)

{

strName = s;

FileEncode ="gb2312";

Version = "20";

StartElement = "channel";

}

//写入StringBuilder对象

public override StringBuilder WriteStringBuilder()

{

string xmlData = stringFormat("<xml version='10' encoding='{0}'><xml-stylesheet type=\"text/xsl\" href=\"{1}\"><rss version='{2}'></rss>",thisFileEncode,thisXslLink,thisVersion);

thisxmlDoc_MetoneLoad(new StringReader(xmlData));

string Key = "-1";

//写入channel

foreach(DataRow r in thisSourceDataTableRows) //依次取出所有行

{

if ((thisKey != null) && (thisParentField != null)) //递归进行XML生成

{

if ((r[thisParentField]ToString()Trim() == "")||(r[thisParentField]ToString()Trim() == "0"))

{

XmlElement treeContentElement = thisxmlDoc_MetoneCreateElement(thisStartElement);

xmlDoc_MetoneDocumentElementAppendChild(treeContentElement);

foreach(DataColumn c in thisSourceDataTableColumns) //依次找出当前记录的所有列属性

{

if ((cCaptionToString()ToLower() == thisParentFieldToLower()))

{

Key = r[thisKey]ToString()Trim();

}

else

{

if ((r[thisParentField]ToString()Trim() == "")||(r[thisParentField]ToString()Trim() == "0"))

{

thisAppendChildElement(cCaptionToString()ToLower(),r[c]ToString()Trim(),treeContentElement);

}

}

}

foreach(DataRow dr in thisSourceDataTableSelect(thisParentField + "=" + Key))

{

if(thisSourceDataTableSelect(thisParentField + "=" + dr[thisKey]ToString())Length >= 0)

thisBulidXmlTree(treeContentElement,dr["ItemID"]ToString()Trim());

else

continue;

}

}

}

else //普通方式生成XML

{

XmlElement treeContentElement = thisxmlDoc_MetoneCreateElement(thisStartElement);

xmlDoc_MetoneDocumentElementAppendChild(treeContentElement);

foreach(DataColumn c in thisSourceDataTableColumns) //依次找出当前记录的所有列属性

{

thisAppendChildElement(cCaptionToString()ToLower(),r[c]ToString()Trim(),treeContentElement);

}

}

}

return new StringBuilder()Append(xmlDoc_MetoneInnerXml);

}

public override string WriteFile()

{

CreatePath();

string xmlData = stringFormat("<xml version='10' encoding='{0}'><xml-stylesheet type=\"text/xsl\" href=\"{1}\"><rss version='{2}'></rss>",thisFileEncode,thisXslLink,thisVersion);

thisxmlDoc_MetoneLoad(new StringReader(xmlData));

string Key = "-1";

//写入channel

foreach(DataRow r in thisSourceDataTableRows) //依次取出所有行

{

if ((thisKey != null)&&(thisParentField != null)) //递归进行XML生成

{

if ((r[thisParentField]ToString()Trim() == "")||(r[thisParentField]ToString()Trim() == "0"))

{

XmlElement treeContentElement = thisxmlDoc_MetoneCreateElement(thisStartElement);

xmlDoc_MetoneDocumentElementAppendChild(treeContentElement);

foreach(DataColumn c in thisSourceDataTableColumns) //依次找出当前记录的所有列属性

{

if ((cCaptionToString()ToLower() == thisParentFieldToLower()))

Key = r[thisKey]ToString()Trim();

else

{

if ((r[thisParentField]ToString()Trim() == "")||(r[thisParentField]ToString()Trim() == "0"))

{

thisAppendChildElement(cCaptionToString()ToLower(),r[c]ToString()Trim(),treeContentElement);

}

}

}

foreach(DataRow dr in thisSourceDataTableSelect(thisParentField + "=" + Key))

{

if(thisSourceDataTableSelect(thisParentField + "=" + dr[thisKey]ToString())Length >= 0)

thisBulidXmlTree(treeContentElement,dr["ItemID"]ToString()Trim());

else

continue;

}

}

}

else //普通方式生成XML

{

XmlElement treeContentElement = thisxmlDoc_MetoneCreateElement(thisStartElement);

xmlDoc_MetoneDocumentElementAppendChild(treeContentElement);

foreach(DataColumn c in thisSourceDataTableColumns) //依次找出当前记录的所有列属性

{

thisAppendChildElement(cCaptionToString()ToLower(),r[c]ToString()Trim(),treeContentElement);

}

}

}

string fileName = thisFileOutPath+thisFileName;

xmlDoc_MetoneSave(fileName);

return fileName;

}

}

//装饰器类

public class XMLDecorator : XMLComponent

{

protected XMLComponent ActualXMLComponent;

private string strDecoratorName;

public XMLDecorator (string str)

{

// how decoration occurs is localized inside this decorator

// For this demo, we simply print a decorator name

strDecoratorName = str;

}

public void SetXMLComponent(XMLComponent xc)

{

ActualXMLComponent = xc;

//ConsoleWriteLine("FileEncode - {0}", xcFileEncode);

GetSettingFromComponent( xc);

}

//将被装入的对象的默认设置为当前装饰者的初始值

public void GetSettingFromComponent(XMLComponent xc)

{

thisFileEncode = xcFileEncode;

thisFileOutPath = xcFileOutPath;

thisIndentation = xcIndentation;

thisSourceDataTable = xcSourceDataTable;

thisStartElement = xcStartElement;

thisVersion = xcVersion;

thisXslLink = xcXslLink;

thisKey = xcKey;

thisParentField = xcParentField;

}

public override string WriteFile()

{

if (ActualXMLComponent != null)

ActualXMLComponentWriteFile();

return null;

}

//写入StringBuilder对象

public override StringBuilder WriteStringBuilder()

{

if (ActualXMLComponent != null)

return ActualXMLComponentWriteStringBuilder();

return null;

}

}

数据类型算是一种字段约束,它限制每个字段能存储什么样的数据、能存储多少数据、能存储的格式等。MySQL/MariaDB大致有5类数据类型,分别是:整形、浮点型、字符串类型、日期时间型以及特殊的ENUM和SET类型。

AppSettings(用在vs2003,05也可以用)<add key="connectionfstringname" value="data source=服务器名或ip; initial catalog=数据库名;user id=用户;password=密码"></add>//可以省略(user id=用户;password=密码)ConnectionStrings<connectionstrings> <add

name="connectionstringname" connectionstring="data source=服务器名;initial

catalog=数据库名;user id=用户;password=密码"

providername="systemdatasqlclient"/></connectiionstring>直接连接数据库文件(1)在webconfig里配置

<connectionstrings><add name="connectionstringname"

connectionstring="data source=/sqlexpress; integrated

security=sspi;AttachDBFilename=|DataDirectory|databasemdf;

"providerName="systemdatasqlclient"</connectionsttrings>(2)直接引用SqlConnection

conn = new SqlConnection(Data Source=/SQLExpress;Integrated

Security=SSPI;AttachDBFilename=|DataDirectory|databasemdf;User

Instance=true);DataDirectory默认是AppData文件夹,你把mdf文件放到里面,改一下文件名(databasemdf)和连接字符串的一样就行了

WinForm连接字符串appconfig(基于net20)首先在项目的属性文件夹下使用 Settingssettings 配置连接字符串,我这里配置了一个 Access数据库

连接保存后VS2005自动生成 appconfig文件(修改 Settingssettings配置此文件会自动更新),内容如下:

<xml version="10" encoding="utf-8" ><configuration> <configSections> </configSections> <connectionStrings>

<add name="frmSignInPropertiesSettingsDBConnString"

connectionString="Provider=MicrosoftJetOLEDB40;DataSource=F:/kaifa/frmSignIn/appData/dbqxmdb;Persist

SecurityInfo=True;Jet OLEDB:Database Password=123" providerName="SystemDataOleDb" /> </connectionStrings></configuration>

XML数据是Web上数据交换和表达的标准形式 和关系数据库相比 XML数据可以表达具有复杂结构的数据 比如树结构的数据 正因为此 在信息集成系统中 XML数据经常被用作信息转换的标准

管理三大领域数据

基于XML数据的特点 XML数据的高效管理通常有着以下的应用

复杂数据的管理

XML可以有效地表达复杂的数据 这些复杂的数据虽然利用关系数据库也可以进行管理 但是这样会带来大量的冗余 比如说文章和作者的信息 如果利用关系数据库 需要分别用关系表达文章和作者的信息 以及这两者之间的关系 这样的表达 在文章和作者关系的关系中分别需要保存文章和作者对应的ID 如果仅仅为了表达文章和作者之间的关系 这个ID是冗余信息 在XML数据中对象之间的关系可以直接用嵌套或者ID IDREF的指向来表达 此外XML数据上的查询可以表达更加复杂的语义 比如XPath可以表达比SQL更为复杂的语义 因此利用XML对复杂数据进行管理是一项有前途的应用

互联网中数据的管理

互联网上的数据与传统的事务数据库与数据仓库都不同 其特点可以表现为模式不明显 经常有缺失信息 对象结构比较复杂 因此在和互联网相关的应用 特别是对从互联网采集和获取的信息进行管理的时候 如果使用传统的关系数据库 存在着产生过多的关系 关系中存在大量的空值等问题 而XML可以用来表达半结构数据 对模式不明显 存在缺失信息和结构复杂的数据可以非常好的表达 特别在许多web系统中 XML已经是数据交换和表达的标准形式 因此XML数据的高效管理在互联网的系统中存在着重要的应用

信息集成中的数据管理

现代信息集成系统超越了传统的联邦数据库和数据集成系统 需要集成多种多样的数据源 包括关系数据库 对象 关系数据库以及网页和文本形式存在的数据 对于这样的数据进行集成 XML这样既可以表达结构数据也可以表达半结构数据的形式成为首选 而在信息集成系统中 为了提高系统的效率 需要建立一个cache 把一部分数据放到本地 在基于XML的信息集成系统中 这个cache就是一个XML数据管理系统 因此XML数据的管理在信息集成系统中也有着重要的应用

开发难点解决之道

在实际的XML数据库以及基于XML的信息集成系统的开发过程中 笔者遇到了一些技术难点 在解决这些难点的过程中 有一些经验是值得借鉴的参考的

关系数据库中复杂查询的优化

在基于关系数据库的XML数据管理系统中 在没有建立索引的情况下 系统的性能非常低 为了提高系统的性能 我们在编码上建立了索引 经过分析 由于在系统中最常做的 *** 作是a x b y的join *** 作 最好的选择是建立二维索引 由于我们的后端数据库没有对二维索引的支持 我们选择了在x和y属性上分别建立B+树的方法 使得系统性能得到了提高 此外 我们发现 在对嵌套查询进行翻译的过程中 如果嵌套查询的结果可能过大 对嵌套查询的结果建立临时表可以提高系统的性能

经验总结 对于一个数据库应用 需要对其workload进行分析 根据workload建立索引 对于执行效率很慢的查询或查询集合 可以通过分析查询计划找出系统的瓶颈进行处理

复杂数据库系统的调试

在调试XML数据的管理系统中 多次出现了小规模数据执行准确 效率很高 而大规模数据执行错误或执行效率很低的情况 对于这种情况 我们采取了定位错误 猜测错误 继而加以解决的策略 也就是首先确定出现错误的 *** 作 使得错误的出现具有可重复性 然后通过逐步删减数据 确定数据出现在哪些数据上 这样就使得调试设计的 *** 作和数据的规模大大减小了 然后根据经验对错误进行猜测 逐步排除错误

经验总结 对于数据规模大 *** 作复杂的数据库系统的调试 首要任务是让错误可以重现 然后把次要因素逐步排除 最后发现问题的所在

复杂数据库系统的测试

由于系统需要处理各种各样的XML上的查询 为了确保系统的健壮性 需要选取多种具有代表性的查询对系统进行测试 为了选取这样的查询 我们考察了XML上影响查询的不同参数 包括查询的长度 查询中包含的关系种类 查询的选择性和查询中约束条件的选择性 根据这些参数 我们分别选择有代表性的查询对系统进行测试

lishixinzhi/Article/program/net/201311/12558

根据存储模型分区上,数据库类型可分为:网络数据库,网络数据库,关系数据库(关系数据库),树的数据库(分层数据库)中,面向对象的数据库(面向对象数据库)等。商业应用主要是关系型数据库,如甲骨文,DB2,SYBASE,MS SQL Server中,信息最大,MySQL和等。详尽的清单是毫无意义的,数据库太多,你不说你的工作是什么,相关方面将难以提供更适合您的数据库。 主要应用一般是互补的脚本ASP + ACCESS ASPNET JSPMICROSOFT的SQL一般是更加复杂和强大,但一分不少相同的脚本和ACCESS MySQL和PHP的结合更加完美,如果你需要处理1000W条数据以上级别的数据,那上面是不合适的,更普遍的使用ORACLE的这个项目是非常困难的,如果你想学习,那么你首先要学会这个网上教学,微软SQL酒吧,ASPNET 20中,应用程序是非常广泛。

以上就是关于对数据频繁修改 *** 作的话 是使用XML还是数据库全部的内容,包括:对数据频繁修改 *** 作的话 是使用XML还是数据库、xml文件字段和数据库表字段相同,怎么把xml里面的数据反向插入数据库、如何从数据库表中生成xml文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9302495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存