分享
 
 
 

ADO 方法访问数据库的封装接口(04)

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

7. DBRecordSet.h

#pragma once

#include <comutil.h>

#pragma comment(lib,"comsupp.lib")

class CDBRecordSetImpl ;

class CDBConnection ;

class AFX_EXT_CLASS CDBRecordSet

{

//构造函数和析构函数

public:

CDBRecordSet(void);

virtual ~CDBRecordSet(void);

//接口函数

public:

/*

* 打开记录集

* [in] szSQL -> SQL语句, select ......

* [out] rConnection -> 本次查询使用的数据库连接

*/

BOOL Open(LPCTSTR szSQL,CDBConnection& rConnection) ;

//记录集是否处于打开状态

BOOL IsOpened() ;

//关闭记录集

BOOL Close(void) ;

//是否记录当前位置位于最后一条记录后面

BOOL IsEof(void);

//是否当前位置位于第一条记录前面

BOOL IsBof(void);

/*

* 获取记录总数

* 返回值:

* -1 -> 错误

* >=0 -> 记录数

*/

int GetRecordCount(void) ;

//移动到第一个记录

BOOL MoveFirst(void) ;

//移到下一个记录

BOOL MoveNext(void) ;

//移动到最后一个记录

BOOL MoveLast(void) ;

//移动到前一个记录

BOOL MovePrevious(void) ;

/*

* 移动到指定记录

* 参数:

* [in] nOffset -> 相对当前位置移动nOffset个记录,nOffset < 0 表示向前移动,nOffset > 0表示向后移动

*/

BOOL Move(int nOffset) ;

/*

* 获取当前记录集中的列总数

* -1 -> 错误

* >=0 -> 列总数

*/

int GetFieldCount(void) ;

/* 获取列号,从0开始

参数

[in] szFieldName 列名

返回值

列号,-1表示没有找到

*/

int GetFieldOrder(LPCTSTR szFieldName) ;

/* 获取列名

参数

[in] nFieldOrder列号,从0开始

返回值

列名 , 返回空串表示没有该序号对应的字段

*/

LPCTSTR GetFieldName(int nFieldOrder) ;

/* 获取列值,返回字符串,若是日期,则按照数据库默认的日期格式返回

参数

[in] nFieldOrder -> 列号,从0开始

[out] strValue -> 返回该序号对应的字段值的字符串

返回值:

TRUE 字段值成功获取

FALSE 获取字段值失败

*/

BOOL GetFieldValue(int nFieldOrder,CString& strValue);

/* 获取列值,返回字符串,若是日期,则按照数据库默认的日期格式返回

参数:

[in] nFieldOrder -> 列号,从0开始

返回值:

列值, 返回空串表示没有该序号对应的字段值或者该字段值为空

*/

LPCTSTR GetFieldValue(int nFieldOrder);

/* 获取列值,返回整型,若字段不是整型或者可以转换为整型的字段,则返回失败

参数

[in] nFieldOrder -> 列号,从0开始

[out] nValue -> 返回该序号对应的字段值的整型值

返回值:

TRUE 字段值成功获取

FALSE 获取字段值失败

*/

BOOL GetFieldValueInt(int nFieldOrder,int& nValue);

/* 获取列值,返回整型,若字段不是整型或者可以转换为整型的字段,则返回失败

参数:

[in] nFieldOrder -> 列号,从0开始

返回值:

列值, 返回值不检查是否成功

*/

int GetFieldValueInt(int nFieldOrder);

/* 获取列值,返回浮点型,若字段不是浮点型或者可以转换为浮点型的字段,则返回失败

参数

[in] nFieldOrder -> 列号,从0开始

[out] nValue -> 返回该序号对应的字段值的浮点型值

返回值:

TRUE 字段值成功获取

FALSE 获取字段值失败

*/

BOOL GetFieldValueFloat(int nFieldOrder,float& fValue);

/* 获取列值,返回浮点型,若字段不是浮点型或者可以转换为浮点型的字段,则返回失败

参数:

[in] nFieldOrder -> 列号,从0开始

返回值:

列值, 返回值不检查是否成功

*/

float GetFieldValueFloat(int nFieldOrder);

/*

* 设置错误信息

* 参数:

* [in] szErrMsg -> 错误信息

* [in] szSourceFile -> 发生错误的源文件

* [in] nLine -> 发生错误的行号

*/

void SetErrorMessage(LPCTSTR szErrMsg,const char* szSourceFile=NULL,int nLine=0);

//获取错误信息

LPCTSTR GetErrorMessage(void) const;

//记录集的复制采用clone的方法,当一个记录集被复制以后,得到两个独立的记录集,

//其中一个关闭以后,另外一个仍然可用。

public:

//copy 构造函数

CDBRecordSet(const CDBRecordSet& rRecordSet) ;

//赋值运算符

CDBRecordSet& operator= (const CDBRecordSet& rRecordSet);

protected:

CDBRecordSetImpl* m_pRecordSetImpl ;

//临时字段名值

CString m_strTempFieldName ;

//临时字段名

CString m_strTempFieldValue ;

};

////////////////////////////////////////////////////////////

8. DBRecordSet.cpp

#include "StdAfx.h"

#include "dbrecordset.h"

#include "DBErrorMsgDefs.h"

#include "DBRecordSetImpl.h"

#include "DBConnection.h"

#define DBRECORDSETPtr m_pRecordSetImpl->GetRecordSet()

CDBRecordSet::CDBRecordSet(void)

{

m_pRecordSetImpl = new CDBRecordSetImpl() ;

}

CDBRecordSet::~CDBRecordSet(void)

{

if(m_pRecordSetImpl)

{

delete m_pRecordSetImpl ;

m_pRecordSetImpl = NULL ;

}

}

//copy 构造函数

CDBRecordSet::CDBRecordSet(const CDBRecordSet& rRecordSet) :

m_pRecordSetImpl(NULL)

{

*this = rRecordSet ;

}

//赋值运算符

CDBRecordSet& CDBRecordSet::operator= (const CDBRecordSet& rRecordSet)

{

if(this == &rRecordSet)

{

return *this ;

}

if(rRecordSet.m_pRecordSetImpl == NULL)

{

if(m_pRecordSetImpl != NULL)

{

delete m_pRecordSetImpl ;

m_pRecordSetImpl = NULL ;

}

}

else

{

if(m_pRecordSetImpl == NULL)

{

m_pRecordSetImpl = new CDBRecordSetImpl() ;

}

*m_pRecordSetImpl = *rRecordSet.m_pRecordSetImpl ; //copy it

}

return *this ;

}

void CDBRecordSet::SetErrorMessage(LPCTSTR szErrMsg,const char* szSourceFile,int nLine)

{

m_pRecordSetImpl->SetErrorMessage(szErrMsg,szSourceFile,nLine) ;

}

LPCTSTR CDBRecordSet::GetErrorMessage(void) const

{

return (LPCTSTR)m_pRecordSetImpl->GetErrorMessage() ;

}

BOOL CDBRecordSet::Open(LPCTSTR szSQL,CDBConnection& rConnection)

{

if(szSQL == NULL)

{

SetErrorMessage(SQL_EMPTYSQL,__FILE__,__LINE__) ;

return FALSE ;

}

else if(_tcslen(szSQL) == 0)

{

SetErrorMessage(SQL_EMPTYSQL,__FILE__,__LINE__) ;

return FALSE ;

}

//check if is connected

if(!rConnection.IsOpened())

{

SetErrorMessage(CONNCTION_NOTCONNECT,__FILE__,__LINE__) ;

return FALSE ;

}

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

//check if is already opened

if(DBRECORDSETPtr->GetState() != adStateClosed)

{

//if is opened,close it first

DBRECORDSETPtr->Close() ;

}

_variant_t vActiveConnection ;

if(!rConnection.GetConnectionIDispatch(vActiveConnection))

{

SetErrorMessage(CONNCTION_IDISPATCHERROR,__FILE__,__LINE__) ;

return FALSE ;

}

DBRECORDSETPtr->CursorLocation = adUseClient ;

HRESULT hr = DBRECORDSETPtr->Open( _variant_t(szSQL),

vActiveConnection,

adOpenKeyset,

adLockReadOnly,

adOptionUnspecified) ;

return (SUCCEEDED(hr)) ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

//关闭记录集

BOOL CDBRecordSet::Close(void)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

HRESULT hr = S_OK ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

hr = DBRECORDSETPtr->Close() ;

}

return (SUCCEEDED(hr)) ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

BOOL CDBRecordSet::IsOpened()

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

return TRUE ;

}

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

BOOL CDBRecordSet::IsEof(void)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return TRUE ;

}

BOOL bEnd = TRUE ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

bEnd = (BOOL)(DBRECORDSETPtr->GetEndOfFile());

}

return bEnd ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return TRUE ;

}

//是否当前位置位于第一条记录前面

BOOL CDBRecordSet::IsBof(void)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return TRUE ;

}

BOOL bEnd = TRUE ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

bEnd = (BOOL)(DBRECORDSETPtr->GetBOF());

}

return bEnd ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return TRUE ;

}

//获取记录总数

int CDBRecordSet::GetRecordCount(void)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return -1 ;

}

int nRecordCount = -1 ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

nRecordCount = (int)DBRECORDSETPtr->GetRecordCount() ;

}

return nRecordCount ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return -1 ;

}

//移动到第一个记录

BOOL CDBRecordSet::MoveFirst(void)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

BOOL bMovedOK = FALSE ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

bMovedOK = SUCCEEDED(DBRECORDSETPtr->MoveFirst()) ;

}

return bMovedOK ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

//移到下一个记录

BOOL CDBRecordSet::MoveNext(void)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

BOOL bMovedOK = FALSE ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

bMovedOK = SUCCEEDED(DBRECORDSETPtr->MoveNext()) ;

}

return bMovedOK ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

//移动到最后一个记录

BOOL CDBRecordSet::MoveLast(void)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

BOOL bMovedOK = FALSE ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

bMovedOK = SUCCEEDED(DBRECORDSETPtr->MoveLast()) ;

}

return bMovedOK ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

//移动到前一个记录

BOOL CDBRecordSet::MovePrevious(void)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

BOOL bMovedOK = FALSE ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

bMovedOK = SUCCEEDED(DBRECORDSETPtr->MovePrevious()) ;

}

return bMovedOK ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

BOOL CDBRecordSet::Move(int nOffset)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

BOOL bMovedOK = FALSE ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

bMovedOK = SUCCEEDED(DBRECORDSETPtr->Move((long)nOffset)) ;

}

return bMovedOK ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

int CDBRecordSet::GetFieldCount(void)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return -1 ;

}

int nFieldCount = -1 ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

if(DBRECORDSETPtr->GetFields() != NULL)

{

//记录集中包含的字段数

nFieldCount = (int)DBRECORDSETPtr->GetFields()->GetCount() ;

}

}

return nFieldCount ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return -1 ;

}

int CDBRecordSet::GetFieldOrder(LPCTSTR szFieldName)

{

try

{

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return -1 ;

}

int nFieldOrder = -1 ;

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

if(DBRECORDSETPtr->GetFields() != NULL)

{

//记录集中包含的字段数

long nFieldCount = (int)DBRECORDSETPtr->GetFields()->GetCount() ;

for(long nIndex = 0L; nIndex < nFieldCount; nIndex++)

{

if(DBRECORDSETPtr->GetFields()->Item[nIndex]->Name == _bstr_t(szFieldName))

{

nFieldOrder = nIndex ;

break ; //找到该字段

}

}

}

}

return nFieldOrder ;

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return -1 ;

}

LPCTSTR CDBRecordSet::GetFieldName(int nFieldOrder)

{

try

{

m_strTempFieldName.Empty() ;

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return (LPCTSTR)m_strTempFieldName;

}

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

if(DBRECORDSETPtr->GetFields() != NULL)

{

//记录集中包含的字段数

long nFieldCount = (int)DBRECORDSETPtr->GetFields()->GetCount() ;

if(nFieldCount > 0)

{

if((nFieldOrder >= 0) && (nFieldOrder < nFieldCount) )

{

m_strTempFieldName = (LPCTSTR)DBRECORDSETPtr->GetFields()->Item[(long)nFieldOrder]->Name ;

}

}

}

}

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return (LPCTSTR)m_strTempFieldName ;

}

BOOL CDBRecordSet::GetFieldValue(int nFieldOrder,CString& strValue)

{

try

{

strValue = _T("") ;

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

if(DBRECORDSETPtr->GetFields() != NULL)

{

//记录集中包含的字段数

long nFieldCount = (int)DBRECORDSETPtr->GetFields()->GetCount() ;

if(nFieldCount > 0)

{

if((nFieldOrder >= 0) && (nFieldOrder < nFieldCount) )

{

//保证字段值不为空才取值,否则会出现异常

if(DBRECORDSETPtr->GetFields()->Item[(long)nFieldOrder]->ActualSize > 0L)

{

strValue = (LPCTSTR)(DBRECORDSETPtr->GetFields()->Item[(long)nFieldOrder]->Value).operator _bstr_t() ;

return TRUE ;

}

}

}

}

}

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

LPCTSTR CDBRecordSet::GetFieldValue(int nFieldOrder)

{

m_strTempFieldValue.Empty() ;

if(!GetFieldValue(nFieldOrder,m_strTempFieldValue))

{

m_strTempFieldValue.Empty() ;

}

return (LPCTSTR)m_strTempFieldValue ;

}

BOOL CDBRecordSet::GetFieldValueInt(int nFieldOrder,int& nValue)

{

try

{

nValue = -1 ;

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

if(DBRECORDSETPtr->GetFields() != NULL)

{

//记录集中包含的字段数

long nFieldCount = (int)DBRECORDSETPtr->GetFields()->GetCount() ;

if(nFieldCount > 0)

{

if((nFieldOrder >= 0) && (nFieldOrder < nFieldCount) )

{

//保证字段值不为空才取值,否则会出现异常

if(DBRECORDSETPtr->GetFields()->Item[(long)nFieldOrder]->ActualSize > 0L)

{

nValue = (int)(DBRECORDSETPtr->GetFields()->Item[(long)nFieldOrder]->Value).operator long() ;

return TRUE;

}

}

}

}

}

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

int CDBRecordSet::GetFieldValueInt(int nFieldOrder)

{

int nValue = 0;

if(!GetFieldValueInt(nFieldOrder,nValue))

{

nValue = 0 ;

}

return nValue ;

}

BOOL CDBRecordSet::GetFieldValueFloat(int nFieldOrder,float& fValue)

{

try

{

fValue = -1 ;

if (!m_pRecordSetImpl->isValid())

{

SetErrorMessage(RECORDSET_INVALIDHANDLE,__FILE__,__LINE__) ;

return FALSE ;

}

if(DBRECORDSETPtr->GetState() == adStateOpen)

{

if(DBRECORDSETPtr->GetFields() != NULL)

{

//记录集中包含的字段数

long nFieldCount = (int)DBRECORDSETPtr->GetFields()->GetCount() ;

if(nFieldCount > 0)

{

if((nFieldOrder >= 0) && (nFieldOrder < nFieldCount) )

{

//保证字段值不为空才取值,否则会出现异常

if(DBRECORDSETPtr->GetFields()->Item[(long)nFieldOrder]->ActualSize > 0L)

{

fValue = (float)(DBRECORDSETPtr->GetFields()->Item[(long)nFieldOrder]->Value).operator float() ;

return TRUE;

}

}

}

}

}

}

catch (_com_error &e)

{

SetErrorMessage((LPCTSTR)e.Description(),__FILE__,__LINE__) ;

}

catch (...)

{

SetErrorMessage(EXCEPTION_UNKNOWN,__FILE__,__LINE__) ;

}

return FALSE ;

}

float CDBRecordSet::GetFieldValueFloat(int nFieldOrder)

{

float fValue = 0.0f ;

if(!GetFieldValueFloat(nFieldOrder,fValue))

{

fValue = 0.0f ;

}

return fValue ;

}

#undef DBRECORDSETPtr

//end

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有