2017-07-13 89 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的調用會增加安全性? –