难题!!!搜索十个access数据库中的所有文本或备注类型的字段,看其中是否有"主题"两字.....
这十个数据库名称分别为c:\1.mdb,c:\2.mdb,...,c:\10.mdb;密码均为0000
如果发现有这两个字,就把它替换成为"文章"并保存之...
并把修改的情况列到一多行文本框中显示.
显示格式如:
数据库1.mdb中的表a中的x字段原为...,其中需要修改部分已作修改.
....
有没有高手能够做到?
问题点数:0、回复次数:6Top
1 楼vicallee(^^一壶红酒杯十年^^)回复于 2004-09-01 23:02:22 得分 0
如果做不到的话,问题可以简化为对一个数据库下的所有表的文本和备注字段作搜索.不过我想这个问题其实跟多个表差不多难度啦.Top
2 楼FlyNesta(菜菜的N次方)回复于 2004-09-02 00:17:52 得分 0
和呵,一个比较笨的办法:
1.先逐个表的修改。
2.从每个表中用select * from 表名,找到所有的字段,用ado中的_RecordsetPtr记录集可以取道每个字段的类型(枚举值),好像202是文本类型,203是备注类型。
3.将所有为文本、备注类型的字段的名称记录下来,在从表中取出这些字段的具体值,将其中含“主题”的字段值改为“文章”。
4.循环的对所有的库进行以上操作。Top
3 楼vicallee(^^一壶红酒杯十年^^)回复于 2004-09-02 09:14:49 得分 0
我的想法是这样的,用ADO动态连接x.mdb(最外层循环),通过某种方式取得ADO连接数据库的TABLE列表,对每个表先select top 1 * from 表,先取得文本类型和备注类型的字段列表放至string astrlist[],再select * from 表 where astrlist[x]='%文章%' or astrlist[x+1]='%文章%'.....
一有记录返回就再行操作...
现在最大的问题是怎么取得ADO连接数据库的TABLE列表,其它都可以解决.Top
4 楼bohut(●伯虎● )回复于 2004-09-02 09:18:27 得分 0
ado
void CdbToolsDlg::GetDatabaseSchema(_ConnectionPtr pConnection, _bstr_t* bstrTableNames, int* nTableCount, _bstr_t bstrFilter)
{
ASSERT(pConnection->State==adStateOpen);
_RecordsetPtr pRstSchema = NULL;
SAFEARRAY FAR* psa = NULL;
SAFEARRAYBOUND rgsabound;
_variant_t var;
_variant_t Array;
rgsabound.lLbound = 0;
rgsabound.cElements = 4;
psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
var.vt = VT_EMPTY;
long ix;
ix = 0;
SafeArrayPutElement(psa, &ix, &var);
ix= 1;
SafeArrayPutElement(psa, &ix, &var);
ix = 2;
SafeArrayPutElement(psa, &ix, &var);
var.vt = VT_BSTR;
//表的类型有"ALIAS""TABLE""SYNONYM""SYSTEM TABLE"
"VIEW""GLOBAL TEMPORARY""LOCAL TEMPORARY""SYSTEM VIEW"
var.bstrVal = bstrFilter;//这里bstrFilter="TABLE"就可以了
ix = 3;
SafeArrayPutElement(psa, &ix, &var);
var.vt=VT_EMPTY;
Array.vt = VT_ARRAY |VT_VARIANT;
Array.parray = psa;
try
{
pRstSchema = pConnection->OpenSchema(adSchemaTables,&Array);
*nTableCount=0;
while(!(pRstSchema->EndOfFile))
{
if(bstrTableNames!=NULL)
{
_bstr_t table_name = pRstSchema->Fields->
GetItem("TABLE_NAME")->Value;
*(bstrTableNames++)=table_name;
}
*nTableCount+=1;
pRstSchema->MoveNext();
}
}
catch (_com_error e) {
PrintComError(e);
}
if(pRstSchema)
if (pRstSchema->State == adStateOpen)
pRstSchema->Close();
}Top
5 楼hahu(神仙?妖怪?谢谢!)回复于 2004-09-02 10:19:52 得分 0
上面只是遍历了所有表
还需要遍历所有字段,获取字符类型字段才行
可以通过判断m_pField->Type是否字符类型,来确定是否需要选出来
select * from field1,field2.. where field1 like '%xx%' or field2 like '%xx%'...
遍历字段可以参考
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=196279
字段的类型
enum DataTypeEnum
{
adEmpty = 0,
adTinyInt = 16,
adSmallInt = 2,
adInteger = 3,
adBigInt = 20,
adUnsignedTinyInt = 17,
adUnsignedSmallInt = 18,
adUnsignedInt = 19,
adUnsignedBigInt = 21,
adSingle = 4,
adDouble = 5,
adCurrency = 6,
adDecimal = 14,
adNumeric = 131,
adBoolean = 11,
adError = 10,
adUserDefined = 132,
adVariant = 12,
adIDispatch = 9,
adIUnknown = 13,
adGUID = 72,
adDate = 7,
adDBDate = 133,
adDBTime = 134,
adDBTimeStamp = 135,
adBSTR = 8,
adChar = 129,
adVarChar = 200,
adLongVarChar = 201,
adWChar = 130,
adVarWChar = 202,
adLongVarWChar = 203,
adBinary = 128,
adVarBinary = 204,
adLongVarBinary = 205,
adChapter = 136,
adFileTime = 64,
adPropVariant = 138,
adVarNumeric = 139,
adArray = 8192
};
Top
6 楼vicallee(^^一壶红酒杯十年^^)回复于 2004-09-02 16:00:00 得分 0
牛人!俺会研究的.Top




