12

以下代码是我一直用来从 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。是否有不同的方法来检查 sql 命令是否成功?

4

7 回答 7

36

如果没有记录匹配,您将得到一个空DataTable,因此您可以检查返回的记录数:

if (dt.Rows.Count > 0)

而且,稍微偏离主题,请阅读您问题下方的评论,然后搜索术语 SQL 注入和参数化 SQL 语句。尝试从这个开始。

于 2012-09-10T20:31:36.140 回答
13

为什么不稍微改变一下语句来查看 DataTable 是 null 还是没有行:

if(dt != null && dt.Rows.Count > 0)

此外,在旁注中,您还应该查看参数化查询,而不是动态构建 SQL。它将减少试图破坏您的应用程序的攻击者的攻击向量数量。

于 2012-09-10T20:31:28.310 回答
2

从 C# 6.0 开始,您可以使用Null 条件运算符 ?.(或?[]用于数组)。

空条件运算符将语句简化为:

if (dt?.Rows?.Count > 0)

这在以下情况下返回 false:

  1. 数据表dt为空
  2. 数据表行为dt.Rows
  3. 行数dt.Rows.Count为 0

使用 null 条件运算符可以避免手动检查数据表和计数属性,例如if (dt != null && dt.Rows.Count > 0)

于 2019-03-17T18:48:43.110 回答
1

在我看来,使用 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
            }
        }
于 2012-09-10T21:01:33.837 回答
0

如果try catch用于检查表是否为空会更好,只需处理IndexOutOfRangeException异常即可。

使用以下逻辑:

try
{
   //dataTable operations
}
catch(IndexOutOfRangeException)
{
}

对我来说它的工作。

于 2013-11-29T16:58:32.520 回答
0

我知道这个问题是旧的,并且在它发布的那一刻得到了帮助,但是现在有一种简单的方法可以解决这个问题,如下所示:

if ((dataTableName?.Rows?.Count ?? 0) > 0)
于 2019-02-25T20:25:38.327 回答
0

DataSet你可以这样检查:

if (ds.Tables[0].Rows.Count > 0)
于 2018-10-03T10:27:54.693 回答