2014-12-05 66 views
0

好吧,我是一名頭痛的編程學生,希望有人能夠治好。如何在ASP.NET中使用Access中的JOIN SQL語句?

我目前正在創建使用ASP.NET在Microsoft Visual Studio中的一個網站,一個項目,這裏是我的問題:

我在Microsoft Access數據庫中包含用戶日誌中的數據表(姓名,電子郵件,密碼)以及包含用戶選擇的用戶安全問題編號(編號是對具有實際問題的ArrayList的引用)以及他們提交的實際答案的鏈接表。

我正在利用Web服務來處理任何需要訪問數據庫的東西。

我想要做的是選擇數據庫中的安全問題編號並返回它的值,但我不確定什麼是正確的SQL語句或者我的代碼是否允許它工作。所以如果有人能幫助我,我會很感激。請注意,我對編程相當陌生。

這裏是我的代碼:

//This retrieves the security question of the user. 
[WebMethod] 
public string GetUserQuestion(string email) 
{ 
    try 
    { 
     //Connect to database. 
     this.ConnectToDatabase(); 

     OleDbCommand cmd = conn.CreateCommand(); 

     //The query to return the value of the index of the question that is stored in the arraylist. 
     cmd.CommandText = @"SELECT SecurityInfo.QuestionNumber FROM [SecurityInfo],[UserDetails] WHERE (UserDetails.Email = '" + email + "' JOIN [UserDetails] ON SecurityInfo.ID = UserDetails.ID)"; 

     //cast the value to a string 
     string userQuestion = cmd.ExecuteReader().ToString(); 

     return userQuestion; 

    } 
    catch (Exception e) 
    { 
     return e.ToString(); 
    } 
    finally 
    { 
     this.DisconnectDatabase(); 
    } 
} 

PS:該方法幾乎做什麼,他們被命名爲所以它不應該是必要的,包括他們的問題。

這是在服務中測試這種方法時,我得到的錯誤:

<string xmlns="http://tempuri.org/"> 
System.Data.OleDb.OleDbException (0x80040E14): Syntax error (missing operator) in query expression '(UserDetails.Email = '[email protected]' JOIN [UserDetails] ON SecurityInfo.ID = UserDetails.ID)'. at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.OleDb.OleDbCommand.ExecuteReader() at PTWService.GetUserQuestion(String email) in c:\Users\Rudi\Documents\Visual Studio 2010\WebSites\PTWService\App_Code\PTWService.cs:line 108 
</string> 

我改變了我的代碼的(這擺脫了錯誤,但我仍然沒有得到什麼,我從數組要):

//This retrieves the security question of the user. 
[WebMethod] 
public string GetUserQuestion(string email) 
{ 
    try 
    { 
     //Connect to database. 
     this.ConnectToDatabase(); 

     OleDbCommand cmd = conn.CreateCommand(); 

     //The query to return the value of the index of the question that is stored in the arraylist. 
     cmd.CommandText = @"SELECT SecurityInfo.QuestionNumber FROM [SecurityInfo] WHERE (UserDetails.Email = '" + email + "') JOIN [UserDetails] ON SecurityInfo.ID = UserDetails.ID"; 

     //Parse the value to a int 
     int UserQuestionNr = Int32.Parse(cmd.ExecuteReader().ToString()); 

     //Get the question from the array. 
     string Question = (string)questionArray[UserQuestionNr]; 


     return Question; 

    } 
    catch (Exception) 
    { 
     return null; 
    } 
    finally 
    { 
     this.DisconnectDatabase(); 
    } 
} 

因此,如果任何人都可以告訴我,如果我的查詢語句是錯誤的,如何糾正它或者它的其他什麼東西完全,我將非常感激。

+0

你可以顯示的結果集你有正確的輸出應該是什麼相處? – JeffO 2014-12-05 18:39:31

+0

我得到的結果是空的,因爲有一些例外在某處逗弄我。數據庫的結果應該是0-7之間的數字,它代表存儲8個安全問題的ArrayList的索引。然後用它從數組中獲取該值,並將其存儲在「問題」變量中,然後返回。 – 2014-12-05 19:07:23

回答

2

不知道你在期待什麼。你得到的記錄太少/很多。

這是我通常期望在Access的SQL代碼。

"SELECT SecurityInfo.QuestionNumber 
FROM [SecurityInfo] 
INNER JOIN [UserDetails] 
ON SecurityInfo.ID = UserDetails.ID 
WHERE (((UserDetails.Email) = '" + email + "'));" 

您還應該檢查發送到數據庫的字符串,以便進行故障排除。

+0

感謝您的回答。 sql代碼很好用!我現在正在排隊。爲了麻煩再次感謝。我只是遇到了一些問題,從數據庫中獲取返回的行並將該值放入一個變量中。但是我仍然在學習,所以我會榨取它,直到我贏得嘿嘿。但基本上你幫助我解決了我的主要問題。 – 2014-12-05 19:10:13

+0

我發現我忘了使用DataReader中的Read()方法。這和你糾正的SQL。我現在定了。 THNX – 2014-12-05 19:30:04

+0

-1,因爲這個sql注入被傳遞的時候沒有任何警告。 – 2014-12-05 19:47:02

0

這是解決辦法,如果有誰想知道:

[WebMethod] 
public string GetUserQuestion(string email) 
{ 
    try 
    { 
     //Connect to database. 
     this.ConnectToDatabase(); 

     OleDbCommand cmd = conn.CreateCommand(); 

     //The query to return the value of the index of the question that is stored in the arraylist. 
     cmd.CommandText = "SELECT SecurityInfo.QuestionNumber FROM [SecurityInfo] INNER JOIN [UserDetails] ON SecurityInfo.ID = UserDetails.ID WHERE (((UserDetails.Email) = '" + email + "'));"; 

     OleDbDataReader reader = cmd.ExecuteReader(); 

     //Only needs to be read once since only one row will always be returned. 
     reader.Read(); 
     int questionNumber = (int)reader["QuestionNumber"]; 

     //Get the question from the array. 
     string Question = (string)questionArray[questionNumber]; 


     return Question; 

    } 
    catch (Exception) 
    { 
     return null; 
    } 
    finally 
    { 
     this.DisconnectDatabase(); 
    } 
}