请教多条件查询优化问题

时间:2022-08-27 05:37:11
前提:
1.使用ADO编程访问access数据库
2.实现语言转换,例如我现在有一个数组CString Lang1[100],还有一张中英文对照表language,结构为:sLanguage,chinese,english等语言字段.
3.调用函数ChangeLanguage(CString *sLang,CString *dLang,int size,CString Language);//实现语言转换
CString *sLang//原始语言
CString *dLang//目标语言
int size;//语言数,也即字符串数(数组长度)
CString Language;//语言类型
我的相法是这样的:

BOOL ChangeLanguage(CString *sLang,CString *dLang,int size,CString Language)
{
_ConnectionPtr m_pConnection;
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
try                 
{
    m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=language.mdb","","",adModeUnknown);
    _RecordsetPtr m_pRecordset;
    m_pRecordset.CreateInstance(__uuidof(Recordset));
    CString csSql;
    _variant_t var;

方法一:
    for(int i=0;i<size;i++)
    {
        csSql.Format("Select * From Language where sLanguage='%s'",sLang[i]);
        m_pRecordset->Open(_bstr_t(cmd),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
        var=m_pRecordset->GetCollect(_bstr_t(Language));
        if(var.vt!=VT_NULL)
           dLang[i]=(LPCSTR)_bstr_t(var);
        else
           dLang[i].Empty();
        m_pRecordset->Cloes();
    }
    
}
catch(_com_error e)
{
AfxMessageBox("错误信息!");
return FALSE;
}  
return TRUE;
}    

方法二:
csSql.Format("Select * From Language where sLanguage='%s'",sLang[0]);
for(int i=0;i<size;i++)
{
   csSql.Format(" or sLanguage='%s'",sLang[i]);
}

m_pRecordset->Open(_bstr_t(cmd),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
   var=m_pRecordset->GetCollect(_bstr_t(Language));
   if(var.vt!=VT_NULL)
      dLang[i]=(LPCSTR)_bstr_t(var);
   else
      dLang[i].Empty();
   m_pRecordset->MoveNext();
}   
m_pRecordset->Cloes();


方法一:实现起来速度有点慢,原数组很多的情况下;
方法二:同样在数组很多的情况下,条件太长会不会有问题,还有这样获得的结果排序也存在问题,会跟原语言对不上,即第一个源字符串,与第一个目标字符串不对应了。也考虑过采用in关键字但排序问题还是存在
不知可不可以采用m_pConnection->execl()方法来实现呢,这样就不用重复打开表了,可以的话请给个例子,谢谢
请大家多给些意见,帮忙想下办法,先在此谢过大家了!

39 个解决方案

#1


up

#2


access数据库这点很难体现出来。。。

#3


我现在的表只有几百条记录。以后记录数还会增加,不过应该在1万条以内。
我做了下测试,对ChangeLanguage()循环调用100次,每次软转换的数组为255条,这样的处理要3秒左右,感觉太慢了。
若采用多条件查询,又存在排序问题,有没有通过条件定位或按条件排序的方法可用呢?

#4


1.你可以不使用记录打开方式
直接用m_pConnection,execute,这样会快一些

2.在access中事先写好查询,ado调用查询,速度也会有所提高

3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高

#5


to:shakaqrj
1:直接用m_pConnection,execute,这样会快一些 
我也有考虑过这种方法,但是不知怎么用,能给个例子吗?

2.在access中事先写好查询,ado调用查询,速度也会有所提高
怎么调用access里面的查询呢?

3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
容器还是不会用

#6


方法一, 除了在sLanguage上建立索引外没想到别的办法。
方法二,一万条记录的话,SQL太长了,ACCESS的话应该会有问题,不过你可以先试试。。

#7


直接用SQL语言运行会快些。

#8


哦,建索引忘掉了~~
execute会返回一个记录集,你用一个记录集接受即可

调用查询,把最后的参数设成存储过程

容器,你看stl

#9


能不能给个简单的调用查询的代码呢?谢谢!!!

#10


假设查询名字叫a,并且有两个参数
那就execute("a 参数1 参数2"....adCmdStoredProc)

#11


还是不行,对存储过程还是没弄明白,
问题一:
是不是先要在数据库中建立一个查询呢?那么这个查询怎么使用存储过程传入的参数呢?根据我的前面的要求,这个查询语句该怎么写呢?
是不是还是用Select * from Language where ....后面的条件怎么写

问题二:
如果题一我想错了,可以直接通过存储过程来操作,那么还有几个问题想请问一下各位大虾:
cmmd->CommandText = _bstr_t("language");//这里看资料说是过程名,是不是指表名或数据库里的查询名
cmmd->CreateParameter( "Language_type",adVarChar,adParamInput,Language_type.GetLength(),Language_type.GetBuffer(0));
参数一是字段名吗?
最后一个参数是第一个参数对应的条件值吗?我的理解是这样的:获得Language_type=Language_type.GetBuffer(0)的记录?
由于接触数据库时间很短,很多东西都不知该怎么弄。也许提的问题本身就是错的,还望各位大虾多多帮忙

#12


参考下面调用存储过程的代码:

ParameterPtr  para[3];  
_CommandPtr  pCmd;  
 
pCmd.CreateInstance("ADODB.Command");  
para[0].CreateInstance("ADODB.Parameter");  
para[1].CreateInstance("ADODB.Parameter");  
para[2].CreateInstance("ADODB.Parameter");  
pCmd->ActiveConnection=m_pConn;  
             
pCmd->CommandText="存储过程名"  
para[0]=pCmd->CreateParameter("",  adBSTR,adParamInput,  sizeof(char[50]),vVar);  //字符串型输入参数  
pCmd->Parameters->Append(para[0]);  
para[1]=pCmd->CreateParameter("",  adInteger,adParamInput,  sizeof(int),olevariantVar);  //整型输入参数  
pCmd->Parameters->Append(para[1]);  
para[2]=pCmd->CreateParameter("",  adBSTR,adParamOutput,  sizeof(char[50]),"");    //字符串型输出参数  
pCmd->Parameters->Append(para[2]);  
pCmd->Execute(  NULL,  NULL,  adCmdStoredProc); 

#13


to: tabby
这段代码我在网上看过了,也试过了,但是不行,我将我的代码贴出来,帮我看下吧
BOOL ChangeLanguage(CString *sLanguage,CString *dLanguage,int lSize,CString Language_type)
{
try
{
_CommandPtr cmmd;  
cmmd.CreateInstance("ADODB.Command");
cmmd->ActiveConnection=mSys_pConnection;
cmmd->CommandType = adCmdStoredProc;
cmmd->CommandText = _bstr_t("Language");//这里我输入的是表名,是否该改为查询名

_ParameterPtr param;
param.CreateInstance("ADODB.Parameter");
for (int i=0;i<lSize;i++)
{
                     //第一个参数为字段名
     param=cmmd->CreateParameter( _bstr_t("Src_Name"),adVarChar,adParamInput,sLanguage[i].GetLength(),sLanguage[i].GetBuffer(0));
     sLanguage[i].ReleaseBuffer();
     cmmd->Parameters->Append(param);
     param = cmmd->CreateParameter( _bstr_t(Language_type),adVarChar,adParamOutput,50,dLanguage[i].GetBuffer(0));
     dLanguage[i].ReleaseBuffer();
     cmmd->Parameters->Append(param);
}
                //一运行下面这句就出错,捕获到的异常是:多步OLE DB操作产生错误。
                  //如果我将循环改为1,捕获到的异常是:Execute后需要有查询名称,是不是cmmd->CommandText = _bstr_t("查询名");呢?
cmmd->Execute(NULL, NULL, adCmdStoredProc);
cmmd.Detach();//使用完毕后释放资源
}
catch (_com_error e)
{
CString ErrMess;
ErrMess.Format("DB ChangeLanguage: %s",(LPCSTR)e.Description());
AfxMessageBox(ErrMess);
return FALSE;
}
return TRUE;
}

#14


cmmd->CommandText = _bstr_t("Language");//这里我输入的是表名,是否该改为查询名 

晕..这里怎么能用表名?? 当然要用存储过程的名字

#15


呵呵,数据库不懂的太多了:(
再请教一个问题,存储过程是什么东东来的?我用的是ACCESS数据库,是不是建立一个查询啊?
我在库里建一个查询,
查询语句为:Select * from language where Src_Name=sLang;//其中Src_Name为表中的字段名,sLang是不是输入参数名呢?那么输出参数(例如Chinese字段)名怎么写呢?

我将代码改成:
//若只有输入,则运行Execute不会出错
param=cmmd->CreateParameter( _bstr_t("sLang"),adVarChar,adParamInput,sLanguage[i].GetLength(),sLanguage[i].GetBuffer(0)); 
sLanguage[i].ReleaseBuffer(); 
cmmd->Parameters->Append(param); 

//加上下面的就会出错,捕获到的异常是:多步OLE DB操作产生错误。Language_type="Chinese"
param = cmmd->CreateParameter( _bstr_t(Language_type),adVarChar,adParamOutput,50,dLanguage[i].GetBuffer(0)); 
dLanguage[i].ReleaseBuffer(); 
cmmd->Parameters->Append(param); 

#16


open("查询名 参数值",...,....)

#17


怎么又变成open了呢,不是execute吗?
我都快搞疯了,问题我前面都说了,是不是没说清楚啊?能不能直接帮我把实现代码写出来呢?数据库我刚接触很多东西都没搞明白啊!!!!

我从新说一下我的问题:
数据库名:language.mdb(access)
表:language
表结构
   sLanguage(备注) chinese(备注)   english(备注)
      1               一               one
      2               二               two
      3               三               three
      4               四               four
     ...              ...            ...
建了一个查询名:LanguageQuery
查询语法为:Select * from language where sLanguage=slang//这里应该有问题,但不知怎么修改,slang我认为是输入的变量

通过存储过程实现下面功能:(别的实现方式也行,只要能提高效率就行)
ChangeLanguage(CString *sLang,CString dLang,int size,CString LangType)
例如 sLang[0]=1
    sLang[1]=3
    sLang[2]=4
则调用ChangeLanguage(sLang,dLang,3,"chinese");
得到结果:
    sLang[0]=一
   sLang[1]=三
   sLang[2]=四 
各位大侠帮帮忙,给我把ChangeLanguage的代码写出来行吗?谢谢!!!

#18


你双击那个查询,是不是让你输入一个参数的?输入之后是不是就能得到查询结果了?

#19


是的

#20


没搞明白Src_Name=sLang
Src_Name字段名?没看到定义阿
还有,字段都是什么类型的?

#21


晕,我怎么看不到后面的回复了,只能看到18楼,回复有20了,后面两个看不到!!!!

#22


Src_Name 就是sLanguage,后来我改名了,是备注类型

#23


引用 17 楼 huziwu 的回复:
怎么又变成open了呢,不是execute吗? 
我都快搞疯了,问题我前面都说了,是不是没说清楚啊?能不能直接帮我把实现代码写出来呢?数据库我刚接触很多东西都没搞明白啊!!!! 

我从新说一下我的问题: 
数据库名:language.mdb(access) 
表:language 
表结构 
   Src_Name(备注) chinese(备注)   english(备注) 
      1               一               one 
      2               二               two 
      …

#24


直接recordset打开不就行了,干嘛先connection?

#25


备注...
我得先试试看了
为什么不用文本类型?

#26


m_pRecordset->Open("a '1'",_variant_t(m_pConn,true),adOpenStatic,adLockOptimistic,adCmdStoredProc);
这样吧

#27


查询名是a
SELECT *
FROM [Language]
WHERE Src_Name=[slang];

#28


试了shakaqrj的方法,可以调用查询。但是速度反而更慢了,比我前面用的方法一还慢。
我用50个字符串进行查询,调用查询运行的时间最快为156毫秒,而采用我原来的方法(通过条件打开表)最快时为141ms。

调用查询:
for(int i=0;i <size;i++) 

        csSql.Format("a '%s'",sLang[i]); 
        m_pRecordset->Open(_bstr_t(cmd),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdStoredProc); 
        var=m_pRecordset->GetCollect(_bstr_t(Language)); 
        if(var.vt!=VT_NULL) 
           dLang[i]=(LPCSTR)_bstr_t(var); 
        else 
           dLang[i].Empty(); 
        m_pRecordset->Cloes(); 


通过条件打开表:
for(int i=0;i <size;i++) 

        csSql.Format("Select * From Language where Src_Name='%s'",sLang[i]); 
        m_pRecordset->Open(_bstr_t(cmd),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 
        var=m_pRecordset->GetCollect(_bstr_t(Language)); 
        if(var.vt!=VT_NULL) 
           dLang[i]=(LPCSTR)_bstr_t(var); 
        else 
           dLang[i].Empty(); 
        m_pRecordset->Cloes(); 

#29


可能50个不多
存储过程第一次执行速度会比普通的sql慢,后面才体现出优势
你建索引
另外第3,4个参数用这个adOpenForwardOnly,adLockReadOnly

#30


说明一下,我一次只找一个,而且sLang[]并不是有序的,它的值可能是这样sLang[0]=100,sLang[1]=5,sLang[2]=200...
这样索引还有用吗?
还有就是我一次软换最多也不会超过200个字符串,但会多次转换。
例如:我按下语言转换时要对多个窗口进行语言转换的
for(int i=0;i<100;i++)//这样要16秒才能执行完成,这样等待的时间感觉太长了,将50换成200就更慢了
   ChangeLanguage(sLang,dLang,50,"Chinese");

#31


索引不是针对程序中的变量
是表中的字段

#32


一般动态切换不是通过数据库,因为没什么管理的,是通过ini文件

#33


第3,4个参数用adOpenForwardOnly,adLockReadOnly速度会快点,单次执行时间为109-125ms

#34


我实际用的表里是有建索引的,因为我前面还有一个ID字段,此字段以升序排序的
我以前的做法也是通过ini文件进行转换的,速度快很多,大概也就1-3秒就转换完成,现在要求要用数据库来存款这些信息,晕死了.

#35


表中的内容很多么?
不多的话
读入到一个stl容器中,比如map

#36


to:shakaqrj
stl容器怎么用呢?我还是头一次听过这个:(

不算多,表中内容大概也就1万条记录左右
我发现用in关键字列出所有条件,再对找出的结果进行排序,那样会快很多,测试时间只要16ms,比原来的方法快了接近10倍
而且in关键字里包括的内容好像也没有限制,我用1万个条件做测试也通过了。
例如:Select * from [language] where Src_Name in ('1','2',……,'10000');

#37


恩?
你到底是要做什么?
我都有点看不懂了

#38


为虾米要用in?
为虾米要用范围?

#39


我是使用关键字in将符合条件的记录先一次性找出来,再进行排序赋值,原来的做是法一条一条去获得,就不用排序赋值。
我把代码贴出来你就知道了。
CString cmd;
cmd.Format("Select * from [language] where Src_Name in ('%s'",sLang[0]);
for(int i=1;i<Size;i++)
{
    cmd.Format(cmd+",'%s'",sLang[i]);
}
cmd.Format(cmd+")");//加上后面的括号
m_pRecordset->Open(_bstr_t(cmd),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

CString tmpSrc;
while(!m_pRecordset->adoEOF)
{
    tmpSrc=(LPCSTR)_bstr_t(m_pRecordset->GetCollect("Src_Name"));
    for(i=0;i<Size;i++)
    {
        if(tmpSrc==sLang[i])
        {
            dLang[i]==(LPCSTR)_bstr_t(m_pRecordset->GetCollect(_bstr_t(LangType)));
            break;//若是源字符串中有相同的,则不能break;要不然后面的找不到
        }
    }
    m_pRecordset->MoveNext();
}
m_pRecordset->Close();
采用上面的代码,速度会快很多,而且我试过,当Size=10000时,也不会报错,只是会慢一点,但比原来的方法就快很多,说明in()里面的内容可能达到10000或更多,而where条件最多好像只能255个

#1


up

#2


access数据库这点很难体现出来。。。

#3


我现在的表只有几百条记录。以后记录数还会增加,不过应该在1万条以内。
我做了下测试,对ChangeLanguage()循环调用100次,每次软转换的数组为255条,这样的处理要3秒左右,感觉太慢了。
若采用多条件查询,又存在排序问题,有没有通过条件定位或按条件排序的方法可用呢?

#4


1.你可以不使用记录打开方式
直接用m_pConnection,execute,这样会快一些

2.在access中事先写好查询,ado调用查询,速度也会有所提高

3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高

#5


to:shakaqrj
1:直接用m_pConnection,execute,这样会快一些 
我也有考虑过这种方法,但是不知怎么用,能给个例子吗?

2.在access中事先写好查询,ado调用查询,速度也会有所提高
怎么调用access里面的查询呢?

3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
容器还是不会用

#6


方法一, 除了在sLanguage上建立索引外没想到别的办法。
方法二,一万条记录的话,SQL太长了,ACCESS的话应该会有问题,不过你可以先试试。。

#7


直接用SQL语言运行会快些。

#8


哦,建索引忘掉了~~
execute会返回一个记录集,你用一个记录集接受即可

调用查询,把最后的参数设成存储过程

容器,你看stl

#9


能不能给个简单的调用查询的代码呢?谢谢!!!

#10


假设查询名字叫a,并且有两个参数
那就execute("a 参数1 参数2"....adCmdStoredProc)

#11


还是不行,对存储过程还是没弄明白,
问题一:
是不是先要在数据库中建立一个查询呢?那么这个查询怎么使用存储过程传入的参数呢?根据我的前面的要求,这个查询语句该怎么写呢?
是不是还是用Select * from Language where ....后面的条件怎么写

问题二:
如果题一我想错了,可以直接通过存储过程来操作,那么还有几个问题想请问一下各位大虾:
cmmd->CommandText = _bstr_t("language");//这里看资料说是过程名,是不是指表名或数据库里的查询名
cmmd->CreateParameter( "Language_type",adVarChar,adParamInput,Language_type.GetLength(),Language_type.GetBuffer(0));
参数一是字段名吗?
最后一个参数是第一个参数对应的条件值吗?我的理解是这样的:获得Language_type=Language_type.GetBuffer(0)的记录?
由于接触数据库时间很短,很多东西都不知该怎么弄。也许提的问题本身就是错的,还望各位大虾多多帮忙

#12


参考下面调用存储过程的代码:

ParameterPtr  para[3];  
_CommandPtr  pCmd;  
 
pCmd.CreateInstance("ADODB.Command");  
para[0].CreateInstance("ADODB.Parameter");  
para[1].CreateInstance("ADODB.Parameter");  
para[2].CreateInstance("ADODB.Parameter");  
pCmd->ActiveConnection=m_pConn;  
             
pCmd->CommandText="存储过程名"  
para[0]=pCmd->CreateParameter("",  adBSTR,adParamInput,  sizeof(char[50]),vVar);  //字符串型输入参数  
pCmd->Parameters->Append(para[0]);  
para[1]=pCmd->CreateParameter("",  adInteger,adParamInput,  sizeof(int),olevariantVar);  //整型输入参数  
pCmd->Parameters->Append(para[1]);  
para[2]=pCmd->CreateParameter("",  adBSTR,adParamOutput,  sizeof(char[50]),"");    //字符串型输出参数  
pCmd->Parameters->Append(para[2]);  
pCmd->Execute(  NULL,  NULL,  adCmdStoredProc); 

#13


to: tabby
这段代码我在网上看过了,也试过了,但是不行,我将我的代码贴出来,帮我看下吧
BOOL ChangeLanguage(CString *sLanguage,CString *dLanguage,int lSize,CString Language_type)
{
try
{
_CommandPtr cmmd;  
cmmd.CreateInstance("ADODB.Command");
cmmd->ActiveConnection=mSys_pConnection;
cmmd->CommandType = adCmdStoredProc;
cmmd->CommandText = _bstr_t("Language");//这里我输入的是表名,是否该改为查询名

_ParameterPtr param;
param.CreateInstance("ADODB.Parameter");
for (int i=0;i<lSize;i++)
{
                     //第一个参数为字段名
     param=cmmd->CreateParameter( _bstr_t("Src_Name"),adVarChar,adParamInput,sLanguage[i].GetLength(),sLanguage[i].GetBuffer(0));
     sLanguage[i].ReleaseBuffer();
     cmmd->Parameters->Append(param);
     param = cmmd->CreateParameter( _bstr_t(Language_type),adVarChar,adParamOutput,50,dLanguage[i].GetBuffer(0));
     dLanguage[i].ReleaseBuffer();
     cmmd->Parameters->Append(param);
}
                //一运行下面这句就出错,捕获到的异常是:多步OLE DB操作产生错误。
                  //如果我将循环改为1,捕获到的异常是:Execute后需要有查询名称,是不是cmmd->CommandText = _bstr_t("查询名");呢?
cmmd->Execute(NULL, NULL, adCmdStoredProc);
cmmd.Detach();//使用完毕后释放资源
}
catch (_com_error e)
{
CString ErrMess;
ErrMess.Format("DB ChangeLanguage: %s",(LPCSTR)e.Description());
AfxMessageBox(ErrMess);
return FALSE;
}
return TRUE;
}

#14


cmmd->CommandText = _bstr_t("Language");//这里我输入的是表名,是否该改为查询名 

晕..这里怎么能用表名?? 当然要用存储过程的名字

#15


呵呵,数据库不懂的太多了:(
再请教一个问题,存储过程是什么东东来的?我用的是ACCESS数据库,是不是建立一个查询啊?
我在库里建一个查询,
查询语句为:Select * from language where Src_Name=sLang;//其中Src_Name为表中的字段名,sLang是不是输入参数名呢?那么输出参数(例如Chinese字段)名怎么写呢?

我将代码改成:
//若只有输入,则运行Execute不会出错
param=cmmd->CreateParameter( _bstr_t("sLang"),adVarChar,adParamInput,sLanguage[i].GetLength(),sLanguage[i].GetBuffer(0)); 
sLanguage[i].ReleaseBuffer(); 
cmmd->Parameters->Append(param); 

//加上下面的就会出错,捕获到的异常是:多步OLE DB操作产生错误。Language_type="Chinese"
param = cmmd->CreateParameter( _bstr_t(Language_type),adVarChar,adParamOutput,50,dLanguage[i].GetBuffer(0)); 
dLanguage[i].ReleaseBuffer(); 
cmmd->Parameters->Append(param); 

#16


open("查询名 参数值",...,....)

#17


怎么又变成open了呢,不是execute吗?
我都快搞疯了,问题我前面都说了,是不是没说清楚啊?能不能直接帮我把实现代码写出来呢?数据库我刚接触很多东西都没搞明白啊!!!!

我从新说一下我的问题:
数据库名:language.mdb(access)
表:language
表结构
   sLanguage(备注) chinese(备注)   english(备注)
      1               一               one
      2               二               two
      3               三               three
      4               四               four
     ...              ...            ...
建了一个查询名:LanguageQuery
查询语法为:Select * from language where sLanguage=slang//这里应该有问题,但不知怎么修改,slang我认为是输入的变量

通过存储过程实现下面功能:(别的实现方式也行,只要能提高效率就行)
ChangeLanguage(CString *sLang,CString dLang,int size,CString LangType)
例如 sLang[0]=1
    sLang[1]=3
    sLang[2]=4
则调用ChangeLanguage(sLang,dLang,3,"chinese");
得到结果:
    sLang[0]=一
   sLang[1]=三
   sLang[2]=四 
各位大侠帮帮忙,给我把ChangeLanguage的代码写出来行吗?谢谢!!!

#18


你双击那个查询,是不是让你输入一个参数的?输入之后是不是就能得到查询结果了?

#19


是的

#20


没搞明白Src_Name=sLang
Src_Name字段名?没看到定义阿
还有,字段都是什么类型的?

#21


晕,我怎么看不到后面的回复了,只能看到18楼,回复有20了,后面两个看不到!!!!

#22


Src_Name 就是sLanguage,后来我改名了,是备注类型

#23


引用 17 楼 huziwu 的回复:
怎么又变成open了呢,不是execute吗? 
我都快搞疯了,问题我前面都说了,是不是没说清楚啊?能不能直接帮我把实现代码写出来呢?数据库我刚接触很多东西都没搞明白啊!!!! 

我从新说一下我的问题: 
数据库名:language.mdb(access) 
表:language 
表结构 
   Src_Name(备注) chinese(备注)   english(备注) 
      1               一               one 
      2               二               two 
      …

#24


直接recordset打开不就行了,干嘛先connection?

#25


备注...
我得先试试看了
为什么不用文本类型?

#26


m_pRecordset->Open("a '1'",_variant_t(m_pConn,true),adOpenStatic,adLockOptimistic,adCmdStoredProc);
这样吧

#27


查询名是a
SELECT *
FROM [Language]
WHERE Src_Name=[slang];

#28


试了shakaqrj的方法,可以调用查询。但是速度反而更慢了,比我前面用的方法一还慢。
我用50个字符串进行查询,调用查询运行的时间最快为156毫秒,而采用我原来的方法(通过条件打开表)最快时为141ms。

调用查询:
for(int i=0;i <size;i++) 

        csSql.Format("a '%s'",sLang[i]); 
        m_pRecordset->Open(_bstr_t(cmd),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdStoredProc); 
        var=m_pRecordset->GetCollect(_bstr_t(Language)); 
        if(var.vt!=VT_NULL) 
           dLang[i]=(LPCSTR)_bstr_t(var); 
        else 
           dLang[i].Empty(); 
        m_pRecordset->Cloes(); 


通过条件打开表:
for(int i=0;i <size;i++) 

        csSql.Format("Select * From Language where Src_Name='%s'",sLang[i]); 
        m_pRecordset->Open(_bstr_t(cmd),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 
        var=m_pRecordset->GetCollect(_bstr_t(Language)); 
        if(var.vt!=VT_NULL) 
           dLang[i]=(LPCSTR)_bstr_t(var); 
        else 
           dLang[i].Empty(); 
        m_pRecordset->Cloes(); 

#29


可能50个不多
存储过程第一次执行速度会比普通的sql慢,后面才体现出优势
你建索引
另外第3,4个参数用这个adOpenForwardOnly,adLockReadOnly

#30


说明一下,我一次只找一个,而且sLang[]并不是有序的,它的值可能是这样sLang[0]=100,sLang[1]=5,sLang[2]=200...
这样索引还有用吗?
还有就是我一次软换最多也不会超过200个字符串,但会多次转换。
例如:我按下语言转换时要对多个窗口进行语言转换的
for(int i=0;i<100;i++)//这样要16秒才能执行完成,这样等待的时间感觉太长了,将50换成200就更慢了
   ChangeLanguage(sLang,dLang,50,"Chinese");

#31


索引不是针对程序中的变量
是表中的字段

#32


一般动态切换不是通过数据库,因为没什么管理的,是通过ini文件

#33


第3,4个参数用adOpenForwardOnly,adLockReadOnly速度会快点,单次执行时间为109-125ms

#34


我实际用的表里是有建索引的,因为我前面还有一个ID字段,此字段以升序排序的
我以前的做法也是通过ini文件进行转换的,速度快很多,大概也就1-3秒就转换完成,现在要求要用数据库来存款这些信息,晕死了.

#35


表中的内容很多么?
不多的话
读入到一个stl容器中,比如map

#36


to:shakaqrj
stl容器怎么用呢?我还是头一次听过这个:(

不算多,表中内容大概也就1万条记录左右
我发现用in关键字列出所有条件,再对找出的结果进行排序,那样会快很多,测试时间只要16ms,比原来的方法快了接近10倍
而且in关键字里包括的内容好像也没有限制,我用1万个条件做测试也通过了。
例如:Select * from [language] where Src_Name in ('1','2',……,'10000');

#37


恩?
你到底是要做什么?
我都有点看不懂了

#38


为虾米要用in?
为虾米要用范围?

#39


我是使用关键字in将符合条件的记录先一次性找出来,再进行排序赋值,原来的做是法一条一条去获得,就不用排序赋值。
我把代码贴出来你就知道了。
CString cmd;
cmd.Format("Select * from [language] where Src_Name in ('%s'",sLang[0]);
for(int i=1;i<Size;i++)
{
    cmd.Format(cmd+",'%s'",sLang[i]);
}
cmd.Format(cmd+")");//加上后面的括号
m_pRecordset->Open(_bstr_t(cmd),theApp.m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

CString tmpSrc;
while(!m_pRecordset->adoEOF)
{
    tmpSrc=(LPCSTR)_bstr_t(m_pRecordset->GetCollect("Src_Name"));
    for(i=0;i<Size;i++)
    {
        if(tmpSrc==sLang[i])
        {
            dLang[i]==(LPCSTR)_bstr_t(m_pRecordset->GetCollect(_bstr_t(LangType)));
            break;//若是源字符串中有相同的,则不能break;要不然后面的找不到
        }
    }
    m_pRecordset->MoveNext();
}
m_pRecordset->Close();
采用上面的代码,速度会快很多,而且我试过,当Size=10000时,也不会报错,只是会慢一点,但比原来的方法就快很多,说明in()里面的内容可能达到10000或更多,而where条件最多好像只能255个