2017-07-13 88 views
0

我在尝试使用此查询来比较我的密码的值,但是当我尝试使用COLLATE SQL_Latin1_General_CP1_CI_AS时,它不起作用。区分大小写的查询比较值

请帮助我在这个问题上

错误消息

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll Additional information: IErrorInfo.GetDescription failed with E_FAIL(0x80004005).

我的代码

OleDbConnection con = new OleDbConnection(); 
con.ConnectionString =  ConfigurationManager.ConnectionStrings["Connection"].ToString(); 
con.Open(); 
OleDbCommand cmd = new OleDbCommand(); 
cmd.CommandText = "SELECT UserName, Password, ID FROM AdminLogin WHERE UserName='" + txtUserName.Text + "' AND Password='" + txtPassword.Password + "' COLLATE SQL_Latin1_General_CP1_CI_AS"; 
cmd.Connection = con; 
OleDbDataReader rd = cmd.ExecuteReader(); 
+0

如果您尝试连接mdb或accdb访问文件,那么您不使用SQL Server排序规则 –

+0

然后我使用哪种排序规则? –

+0

请参阅[本文](https://support.microsoft.com/en-us/help/244693/how-to-perform-a-case-sensitive-join-through-microsoft-jet?wa=wsignin1.0 )来自MS。 –

回答

-1

您可以使用此选项,也将增加安全性SQL注射剂

cmd.CommandText = "SELECT UserName, Password, ID FROM AdminLogin WHERE StrComp(UserName,'" + txtUserName.Text + "',0)=0 AND StrComp(Password,'" + txtPassword.Password + "',0)=0 "; 
+0

MS Access只支持一次执行一条语句的事实已经可以抵御SQL注入攻击。但更一般地说,简单地将用户输入放在SQL的“内部”函数调用中并不是阻止注入的有效技术。如果您使用的数据库引擎允许多个语句,则用户输入仍然可以有效地包含完成第一个语句的文本,注入自己的SQL,然后注释或取消后面的部分。最好的防御措施是使用参数,将输入格式适当并有效地格式化为适当的数据类型等。 –

+0

@CPerkins Access一次执行一个语句的事实有助于防止“Password =”1或1 = 1“那种sql注入攻击? –

+0

它不能防止所有可能的变化。这就是我提到使用参数的原因。我应该用“很多”,“有帮助”或类似的东西来限定这个陈述。但是,这个事实_does_阻止了_complete_ SQL语句(如DELETE或INSERT)以及原始语句的注入。现在考虑一个像'',0)或StrComp('A','',这将产生有效的SQL标准StrComp(Password,'',0)或StrComp('A','A',0) = 0'我解释了我的说法,那么如何解释为什么添加对StrComp的调用会增加安全性? –