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秒左右,感觉太慢了。
若采用多条件查询,又存在排序问题,有没有通过条件定位或按条件排序的方法可用呢?
我做了下测试,对ChangeLanguage()循环调用100次,每次软转换的数组为255条,这样的处理要3秒左右,感觉太慢了。
若采用多条件查询,又存在排序问题,有没有通过条件定位或按条件排序的方法可用呢?
#4
1.你可以不使用记录打开方式
直接用m_pConnection,execute,这样会快一些
2.在access中事先写好查询,ado调用查询,速度也会有所提高
3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
直接用m_pConnection,execute,这样会快一些
2.在access中事先写好查询,ado调用查询,速度也会有所提高
3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
#5
to:shakaqrj
1:直接用m_pConnection,execute,这样会快一些
我也有考虑过这种方法,但是不知怎么用,能给个例子吗?
2.在access中事先写好查询,ado调用查询,速度也会有所提高
怎么调用access里面的查询呢?
3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
容器还是不会用
1:直接用m_pConnection,execute,这样会快一些
我也有考虑过这种方法,但是不知怎么用,能给个例子吗?
2.在access中事先写好查询,ado调用查询,速度也会有所提高
怎么调用access里面的查询呢?
3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
容器还是不会用
#6
方法一, 除了在sLanguage上建立索引外没想到别的办法。
方法二,一万条记录的话,SQL太长了,ACCESS的话应该会有问题,不过你可以先试试。。
方法二,一万条记录的话,SQL太长了,ACCESS的话应该会有问题,不过你可以先试试。。
#7
直接用SQL语言运行会快些。
#8
哦,建索引忘掉了~~
execute会返回一个记录集,你用一个记录集接受即可
调用查询,把最后的参数设成存储过程
容器,你看stl
execute会返回一个记录集,你用一个记录集接受即可
调用查询,把最后的参数设成存储过程
容器,你看stl
#9
能不能给个简单的调用查询的代码呢?谢谢!!!
#10
假设查询名字叫a,并且有两个参数
那就execute("a 参数1 参数2"....adCmdStoredProc)
那就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)的记录?
由于接触数据库时间很短,很多东西都不知该怎么弄。也许提的问题本身就是错的,还望各位大虾多多帮忙
问题一:
是不是先要在数据库中建立一个查询呢?那么这个查询怎么使用存储过程传入的参数呢?根据我的前面的要求,这个查询语句该怎么写呢?
是不是还是用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;
}
这段代码我在网上看过了,也试过了,但是不行,我将我的代码贴出来,帮我看下吧
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);
再请教一个问题,存储过程是什么东东来的?我用的是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的代码写出来行吗?谢谢!!!
我都快搞疯了,问题我前面都说了,是不是没说清楚啊?能不能直接帮我把实现代码写出来呢?数据库我刚接触很多东西都没搞明白啊!!!!
我从新说一下我的问题:
数据库名: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字段名?没看到定义阿
还有,字段都是什么类型的?
Src_Name字段名?没看到定义阿
还有,字段都是什么类型的?
#21
晕,我怎么看不到后面的回复了,只能看到18楼,回复有20了,后面两个看不到!!!!
#22
Src_Name 就是sLanguage,后来我改名了,是备注类型
#23
#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];
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();
}
我用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
存储过程第一次执行速度会比普通的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");
这样索引还有用吗?
还有就是我一次软换最多也不会超过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秒就转换完成,现在要求要用数据库来存款这些信息,晕死了.
我以前的做法也是通过ini文件进行转换的,速度快很多,大概也就1-3秒就转换完成,现在要求要用数据库来存款这些信息,晕死了.
#35
表中的内容很多么?
不多的话
读入到一个stl容器中,比如map
不多的话
读入到一个stl容器中,比如map
#36
to:shakaqrj
stl容器怎么用呢?我还是头一次听过这个:(
不算多,表中内容大概也就1万条记录左右
我发现用in关键字列出所有条件,再对找出的结果进行排序,那样会快很多,测试时间只要16ms,比原来的方法快了接近10倍
而且in关键字里包括的内容好像也没有限制,我用1万个条件做测试也通过了。
例如:Select * from [language] where Src_Name in ('1','2',……,'10000');
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个
我把代码贴出来你就知道了。
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秒左右,感觉太慢了。
若采用多条件查询,又存在排序问题,有没有通过条件定位或按条件排序的方法可用呢?
我做了下测试,对ChangeLanguage()循环调用100次,每次软转换的数组为255条,这样的处理要3秒左右,感觉太慢了。
若采用多条件查询,又存在排序问题,有没有通过条件定位或按条件排序的方法可用呢?
#4
1.你可以不使用记录打开方式
直接用m_pConnection,execute,这样会快一些
2.在access中事先写好查询,ado调用查询,速度也会有所提高
3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
直接用m_pConnection,execute,这样会快一些
2.在access中事先写好查询,ado调用查询,速度也会有所提高
3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
#5
to:shakaqrj
1:直接用m_pConnection,execute,这样会快一些
我也有考虑过这种方法,但是不知怎么用,能给个例子吗?
2.在access中事先写好查询,ado调用查询,速度也会有所提高
怎么调用access里面的查询呢?
3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
容器还是不会用
1:直接用m_pConnection,execute,这样会快一些
我也有考虑过这种方法,但是不知怎么用,能给个例子吗?
2.在access中事先写好查询,ado调用查询,速度也会有所提高
怎么调用access里面的查询呢?
3.只有一万条记录,而且字段不多,推荐用容器,速度会有极大提高
容器还是不会用
#6
方法一, 除了在sLanguage上建立索引外没想到别的办法。
方法二,一万条记录的话,SQL太长了,ACCESS的话应该会有问题,不过你可以先试试。。
方法二,一万条记录的话,SQL太长了,ACCESS的话应该会有问题,不过你可以先试试。。
#7
直接用SQL语言运行会快些。
#8
哦,建索引忘掉了~~
execute会返回一个记录集,你用一个记录集接受即可
调用查询,把最后的参数设成存储过程
容器,你看stl
execute会返回一个记录集,你用一个记录集接受即可
调用查询,把最后的参数设成存储过程
容器,你看stl
#9
能不能给个简单的调用查询的代码呢?谢谢!!!
#10
假设查询名字叫a,并且有两个参数
那就execute("a 参数1 参数2"....adCmdStoredProc)
那就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)的记录?
由于接触数据库时间很短,很多东西都不知该怎么弄。也许提的问题本身就是错的,还望各位大虾多多帮忙
问题一:
是不是先要在数据库中建立一个查询呢?那么这个查询怎么使用存储过程传入的参数呢?根据我的前面的要求,这个查询语句该怎么写呢?
是不是还是用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;
}
这段代码我在网上看过了,也试过了,但是不行,我将我的代码贴出来,帮我看下吧
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);
再请教一个问题,存储过程是什么东东来的?我用的是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的代码写出来行吗?谢谢!!!
我都快搞疯了,问题我前面都说了,是不是没说清楚啊?能不能直接帮我把实现代码写出来呢?数据库我刚接触很多东西都没搞明白啊!!!!
我从新说一下我的问题:
数据库名: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字段名?没看到定义阿
还有,字段都是什么类型的?
Src_Name字段名?没看到定义阿
还有,字段都是什么类型的?
#21
晕,我怎么看不到后面的回复了,只能看到18楼,回复有20了,后面两个看不到!!!!
#22
Src_Name 就是sLanguage,后来我改名了,是备注类型
#23
#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];
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();
}
我用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
存储过程第一次执行速度会比普通的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");
这样索引还有用吗?
还有就是我一次软换最多也不会超过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秒就转换完成,现在要求要用数据库来存款这些信息,晕死了.
我以前的做法也是通过ini文件进行转换的,速度快很多,大概也就1-3秒就转换完成,现在要求要用数据库来存款这些信息,晕死了.
#35
表中的内容很多么?
不多的话
读入到一个stl容器中,比如map
不多的话
读入到一个stl容器中,比如map
#36
to:shakaqrj
stl容器怎么用呢?我还是头一次听过这个:(
不算多,表中内容大概也就1万条记录左右
我发现用in关键字列出所有条件,再对找出的结果进行排序,那样会快很多,测试时间只要16ms,比原来的方法快了接近10倍
而且in关键字里包括的内容好像也没有限制,我用1万个条件做测试也通过了。
例如:Select * from [language] where Src_Name in ('1','2',……,'10000');
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个
我把代码贴出来你就知道了。
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个