【SOS】ADO 查询ACCESS时不能区分大小写。该怎么区分?

时间:2020-12-30 00:48:36
ADO查询ACCESS数据库时,不能区分大小写。比如下面这条语句:
select * from myuser where name='1' and pwd='Q'
如果数据库中有name="1" pwd="q" 而没有name="1" pwd="Q"的记录时,照样能查出结果来。
程序的相关代码如下,请各位大侠帮忙看看,先谢过了,^_^。

查询的代码:

        m_sql="select * from myuser where name='1' and pwd='Q'";
        CMyADO myado;
int count=myado.Select(m_sql);
CString num;
num.Format("有%d条查询结果",count);
MessageBox(num);


CMyADO类的相关定义如下:

class CMyADO  
{
public:
bool CloseRecord();
_RecordsetPtr m_pRecordset;  //指向RecordSet的指针
int m_nResultRow; //查询结果行数 
int m_nResultCol; //查询结果列数
CStringArray m_strarr; //存放查询结果数组
CString errormessage; //ADO错误信息 


CMyADO();
virtual ~CMyADO();
int Select(CString Sql); //执行SQL查询语句,结果放在数组pData中 
int Excute(CString Sql); //执行无返回值得SQL语句 

};

CMyADO::CMyADO()
{
m_pRecordset.CreateInstance("ADODB.Recordset"); //创建Recordset对象的实例:
m_nResultRow=0; // 
m_nResultCol=0; //记录集行数和列数
}

extern CADOApp theApp;  //要用到在CMyApp中与数据库建立的连接
int CMyADO::Select(CString Sql) //执行SQL查询语句,结果放在数组pData中 
{
try
{
m_pRecordset->Open(_bstr_t(Sql),_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
// int count=m_pRecordset->RecordCount;  //得到查询结果的行数
m_nResultCol = m_pRecordset->Fields->GetCount();//得到查询结果的列数
m_nResultRow = m_pRecordset->GetRecordCount();  //得到查询结果的行数

if (m_nResultRow==0)
{
return 0;
}
else
m_pRecordset->MoveFirst();

while (!m_pRecordset->adoEOF)
{
int col;
for (col=0;col<m_nResultCol;col++)
{
_variant_t temp;
_variant_t vcol=(long)col;
temp=m_pRecordset->GetCollect(vcol);

//将temp中的数据类型转换为string,temp中的数据类型放在vt中,可以通过
//temp.vt和VT_BOOL,VT_I2等比较获得。具体类型查MSDN中的VARTYPE
if (temp.vt==VT_NULL)
{
CString stemp="";
m_strarr.Add(stemp);
}
else
{
temp.ChangeType(VT_BSTR);  //将temp中的数据转换为VT_BSTR(string类型)
CString strtemp=(LPCTSTR)(_bstr_t)temp;
// AfxMessageBox(strtemp);
m_strarr.Add(strtemp);
}

}
m_pRecordset->MoveNext();
}
return m_nResultRow;  //返回记录集的行数

}
catch(_com_error e)///捕捉异常
{
errormessage.Format("%s%s","打开结果集失败:",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
return 0;
}
}

18 个解决方案

#1


select出来之后在程序代码里再比一次,呵呵,笨办法.

#2


引用 1 楼 wy2001wy 的回复:
select出来之后在程序代码里再比一次,呵呵,笨办法.

呵呵,这个想法有创意,不过我觉得应该可以有方法直接区分大小写吧。

#3


关注这个问题,1楼的办法也行,但是比较繁琐,会增加程序处理时间!

#4


看看这个不知道有没有帮助,也是在代码里实现的
http://hi.baidu.com/cyico/blog/item/aaa1bb0a5d27191c94ca6b66.html

#5


引用 2 楼 yeajay 的回复:
引用 1 楼 wy2001wy 的回复:
select出来之后在程序代码里再比一次,呵呵,笨办法.

呵呵,这个想法有创意,不过我觉得应该可以有方法直接区分大小写吧。

这个好像问过很多次了,SQL是不区分大小写的,最好还是自己取出来,然后再过滤大小写

#6



Microsoft Jet(Access MDB) 引擎好像做不到这个,但 SQL Server 引擎可以做到区分大小写。

#7


解决方法:

1、换成 SQL Server 数据库;

2、自己检测;

3、明确表明密码区域不区分大小写。



说明:绿色表明为最佳(偷懒)的方法!

#8


存ASC码。。

#9


一般数据库里不存储用户的原始密码吧,是不是可以对密码处理一下然后取出来比较一下,是不是可以不同程度上减少一下问题的产生呢?用户名也可以同样处理一下,不知道可不可以

#10


引用 8 楼 cxz1985 的回复:
存ASC码。。

大侠可以具体说说怎么做吗?3Q~~

#11


引用 10 楼 yeajay 的回复:
引用 8 楼 cxz1985 的回复:
存ASC码。。

大侠可以具体说说怎么做吗?3Q~~

就是把字母等用它对应的char值等来存值,这样大小写的ascii码值是不一样的,查询的时候查这个码值,就可以区分了

#12


引用 11 楼 oyljerry 的回复:
引用 10 楼 yeajay 的回复:
引用 8 楼 cxz1985 的回复: 
存ASC码。。 

大侠可以具体说说怎么做吗?3Q~~ 
 
就是把字母等用它对应的char值等来存值,这样大小写的ascii码值是不一样的,查询的时候查这个码值,就可以区分了

明白,呵呵,有没有什么设置可以直接区分大小写呢?

#13


直接区分,Access中不能支持,只能自己取出来了,然后再自己过滤

#14


SELECT case_sensitive_data FROM table_name WHERE StrComp(case_sensitive_data, “some_data”,0)=0

#15


看懂了,蒋大哥的方法不错!


select * from myuser where name='1' and (StrComp(pwd,'Q',0)=0)


StrComp 的用法见下面页面:

http://office.microsoft.com/zh-cn/access/HA012289142052.aspx

#16


老大出现在地表!!

#17


up

#18


顶一个,正好遇到这个问题

#1


select出来之后在程序代码里再比一次,呵呵,笨办法.

#2


引用 1 楼 wy2001wy 的回复:
select出来之后在程序代码里再比一次,呵呵,笨办法.

呵呵,这个想法有创意,不过我觉得应该可以有方法直接区分大小写吧。

#3


关注这个问题,1楼的办法也行,但是比较繁琐,会增加程序处理时间!

#4


看看这个不知道有没有帮助,也是在代码里实现的
http://hi.baidu.com/cyico/blog/item/aaa1bb0a5d27191c94ca6b66.html

#5


引用 2 楼 yeajay 的回复:
引用 1 楼 wy2001wy 的回复:
select出来之后在程序代码里再比一次,呵呵,笨办法.

呵呵,这个想法有创意,不过我觉得应该可以有方法直接区分大小写吧。

这个好像问过很多次了,SQL是不区分大小写的,最好还是自己取出来,然后再过滤大小写

#6



Microsoft Jet(Access MDB) 引擎好像做不到这个,但 SQL Server 引擎可以做到区分大小写。

#7


解决方法:

1、换成 SQL Server 数据库;

2、自己检测;

3、明确表明密码区域不区分大小写。



说明:绿色表明为最佳(偷懒)的方法!

#8


存ASC码。。

#9


一般数据库里不存储用户的原始密码吧,是不是可以对密码处理一下然后取出来比较一下,是不是可以不同程度上减少一下问题的产生呢?用户名也可以同样处理一下,不知道可不可以

#10


引用 8 楼 cxz1985 的回复:
存ASC码。。

大侠可以具体说说怎么做吗?3Q~~

#11


引用 10 楼 yeajay 的回复:
引用 8 楼 cxz1985 的回复:
存ASC码。。

大侠可以具体说说怎么做吗?3Q~~

就是把字母等用它对应的char值等来存值,这样大小写的ascii码值是不一样的,查询的时候查这个码值,就可以区分了

#12


引用 11 楼 oyljerry 的回复:
引用 10 楼 yeajay 的回复:
引用 8 楼 cxz1985 的回复: 
存ASC码。。 

大侠可以具体说说怎么做吗?3Q~~ 
 
就是把字母等用它对应的char值等来存值,这样大小写的ascii码值是不一样的,查询的时候查这个码值,就可以区分了

明白,呵呵,有没有什么设置可以直接区分大小写呢?

#13


直接区分,Access中不能支持,只能自己取出来了,然后再自己过滤

#14


SELECT case_sensitive_data FROM table_name WHERE StrComp(case_sensitive_data, “some_data”,0)=0

#15


看懂了,蒋大哥的方法不错!


select * from myuser where name='1' and (StrComp(pwd,'Q',0)=0)


StrComp 的用法见下面页面:

http://office.microsoft.com/zh-cn/access/HA012289142052.aspx

#16


老大出现在地表!!

#17


up

#18


顶一个,正好遇到这个问题