2013-04-26 89 views
2

我收到一個錯誤,我無法從下面的函數返回一個值。幫助將不勝感激。從函數返回值 - 錯誤

private void UserExiest(string username) 
{ 
    SqlConnection myConnection = new SqlConnection("user id=test;" + 
      "password=test;" + 
      "server=.;" + 
      "Trusted_Connection=yes;" + 
      "database=DB; " + 
      "MultipleActiveResultSets=True;" + 
      "connection timeout=30"); 

    myConnection.Open(); 
    SqlCommand CHECKNPC = new SqlCommand("select struserid from USERDATA where strUserId = '" + username + "'", myConnection); 
    SqlDataReader NpcReader = CHECKNPC.ExecuteReader(); 
    if (NpcReader.HasRows) 
    { 
     return "1"; 
    } 
    else 
    { 
     return "0"; 
    } 
    myConnection.Close(); 
} 
+0

更改爲'private int UserExiest' – 2013-04-26 12:10:49

+2

你永遠不會關閉你的連接,你不應該總是依賴GC **編輯**而只是'返回NPCReader。HasRows' – Sayse 2013-04-26 12:11:37

+0

使用SQLConnection的Using語句,效果更好,並在完成後處理 – Max 2013-04-26 12:15:51

回答

3

你的方法簽名不具有返回類型:

private void UserExist(string username) 

您可能想要返回布爾值

private bool UserExist(string username) 

return true; 
// or 
return false; 
4

您的函數返回類型void。你不能從那裏返回一個字符串。你的函數簽名改爲:

private string UserExist(string username) 

它的更好,如果你回到bool,因爲你如果NpcReader.HasRows檢查,然後在真實"0"情況下,虛假的情況下返回"1"。在返回值之前關閉連接也更好。

始終使用SqlParameter或參數化查詢,您當前的查詢將打開爲SQL Injection

+0

@Tim,感謝編輯 – Habib 2013-04-26 12:14:56

1
private void UserExiest(string username) 

更改爲:

private string UserExiest(string username) 

因爲你似乎是返回一個字符串看到...

0

你在你的方法中使用了return語句,而它的定義表明你必須返回void嗎? 你的定義梅索德更改爲:

private string UserExiest(string username) 
0

正如在這裏的許多建議的迴應,你需要返回類型添加到您的功能。將void更改爲string以返回該值。由於該值爲10可能會更好地返回truefalse

此外,您有返回後您的連接關閉聲明。該聲明不會在正常的應用程序流程中觸發。請嘗試以下操作:

private bool UserExiest(string username) 
{ 
    SqlConnection myConnection = new SqlConnection("user id=test;" + 
      "password=test;" + 
      "server=.;" + 
      "Trusted_Connection=yes;" + 
      "database=DB; " + 
      "MultipleActiveResultSets=True;" + 
      "connection timeout=30"); 
    try 
    { 
     myConnection.Open(); 
     SqlCommand CHECKNPC = new SqlCommand("select struserid from USERDATA where strUserId = '" + username + "'", myConnection); 
     SqlDataReader NpcReader = CHECKNPC.ExecuteReader(); 
     return NpcReader.HasRows; 
    } 
    finally 
    { 
     if (myConnection.State != System.Data.ConnectionState.Closed) 
     { 
      myConnection.Close(); 
     } 

    } 
} 

我只是增加了一個finally塊,以確保關閉連接,改變了返回類型booleantruefalse

3
private bool UserExist(string username) 
{ 
    using (var con = new SqlConnection("...")) 
    { 
     con.Open(); 
     using (var cmd = new SqlCommand("...", con)) 
     { 
      using (var r = cmd.ExecuteReader()) 
      { 
       return r.HasRows; 
      } 
     } 
    } 
} 

儘管你的原單功能不返回任何值,不關閉連接 - 你想實現不必要的邏輯(返回而不是返回準備使用布爾值串旗,這是表達式的結果reader.HasRows)。最後,請記住using語句,同時處理IDisposable類型的實現,這些類型保證執行與釋放,釋放或重置非託管資源相關的應用程序定義的任務(請參閱msdn)。