检查数据表是否为空

时间:2012-09-10 20:29:31

标签: c# sql

以下代码是我用来从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是否成功?

7 个答案:

答案 0 :(得分:32)

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

if (dt.Rows.Count > 0)

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

答案 1 :(得分:10)

为什么不稍微更改语句以查看DataTable是空还是没有行:

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

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

答案 2 :(得分: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
            }
        }

答案 3 :(得分:0)

如果使用try catch检查表是否为空,最好处理IndexOutOfRangeException例外。

使用以下逻辑:

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

对我而言。

答案 4 :(得分:0)

对于location = /comments { return 301 /comments/; } location ~ /comments/(?<ndpath>.*) { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_pass_request_headers on; proxy_set_header Connection "keep-alive"; proxy_store off; proxy_pass http://dev.example.com:8080/$ndpath$is_args$args; gzip on; gzip_proxied any; gzip_types *; } ,您可以像这样检查:

DataSet

答案 5 :(得分:0)

我知道这个问题很旧,答案在发布时就很有帮助,但是现在有一种简单的方法可以解决此问题,如下所示:

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

答案 6 :(得分:0)

从C#6.0开始,您可以使用Null conditional operator ?.(或?[]用于数组)。

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

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

在以下情况下返回false:

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

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