2013-04-26 88 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)。