以下代码是我用来从sql数据库中检索用户信息的代码。
string userName = LoginUser.UserName;
string password = LoginUser.Password;
string comm = "SELECT Username,Password,Clientname,Role FROM Users WHERE Username = '" + userName + "';";
bool rememberUserName = LoginUser.RememberMeSet;
SqlConnection conn = new SqlConnection(connstring);
conn.Open();
SqlCommand command = new SqlCommand(comm, conn);
SqlDataAdapter da = new SqlDataAdapter(command);
DataTable dt = new DataTable();
da.Fill(dt);
DataRow dr = dt.NewRow();
if (dt != null)
{
//logic
}
但是,如果数据库中没有用户名等于LoginUser.Username的条目,则(dt!= null)不返回false。是否有不同的方法来检查sqlcommand是否成功?
如果没有记录匹配,您将获得一个空的DataTable
,因此您可以检查返回的记录数:
if (dt.Rows.Count > 0)
而且,略微偏离主题,请阅读您的问题下面的评论,然后谷歌术语SQL注入和参数化SQL语句。尝试从this开始。
为什么不稍微更改语句以查看DataTable是null还是没有行:
if(dt != null && dt.Rows.Count > 0)
另外,在旁注中,您还应该查看参数化查询,而不是动态构建SQL。它将减少试图破坏您的应用程序的攻击者的攻击媒介数量。
在我看来,使用DataTable和SqlDataAdapter对于任务而言有点过于沉重。
你可以在这里使用DataReader:
SqlCommand command = new SqlCommand(comm, conn);
using (var reader = command.ExecuteQuery())
{
if (reader.Read())
{
//logic
var userName = reader.GetString(0);
var password = reader.GetString(1);
// etc
}
}
如果你使用try catch
来检查表是否为空,那就更好了,只需处理IndexOutOfRangeException
异常。
使用以下逻辑:
try
{
//dataTable operations
}
catch(IndexOutOfRangeException)
{
}
对我来说它的工作。
对于DataSet
,您可以这样检查:
if (ds.Tables[0].Rows.Count > 0)
我知道这个问题是旧问题,答案在发布的那一刻得到了帮助,但现在有一种简单的方法可以解决这个问题,如下所示:
if ((dataTableName?.Rows?.Count ?? 0) > 0)
从C#6.0开始,您可以使用Null conditional operator ?.
(或?[]
用于数组)。
null条件运算符将语句简化为:
if (dt?.Rows?.Count > 0)
在以下情况下返回false:
dt
为nulldt.Rows
为空dt.Rows.Count
为0使用空条件运算符可以避免手动检查数据表和计数属性,例如if (dt != null && dt.Rows.Count > 0)