检查SQL语句在C#中是否返回空

时间:2015-02-25 08:37:42

标签: c# sql

我正在尝试检查我的查询是否返回值,但我无法理解它,因为if-statement有效但else if-statement无效。

基本上我想在查询返回空时将Label设置为Visible = False

我的代码:

SqlConnection conn = new SqlConnection(strCon);
    SqlCommand cmd = new SqlCommand("SELECT url, websiteId FROM Website WHERE name LIKE @search + '%' OR url LIKE @search + '%'", conn);
    conn.Open();
    cmd.Parameters.AddWithValue("@search", search);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);


    if (cmd.ExecuteNonQuery() != 0)
       {
          ListViewWebsite.DataSource = dt;
          ListViewWebsite.DataBind();
       }
    else if(cmd.ExecuteNonQuery() == 0)
       {
          LabelWebsite.Visible = false;
       }
  conn.Close();

如果查询返回某些内容,则数据绑定工作正常。

编辑:我知道我多次运行查询,这段代码只是测试一堆不同的东西的结果。刚发布,以便更好地了解我想要实现的目标

5 个答案:

答案 0 :(得分:2)

由于您填写DataTable,您只需要检查它是否包含行:

LabelWebsite.Visible = dt.Rows.Count > 0;

如果您使用DataReader,则可以使用HasRows property

答案 1 :(得分:0)

ExecuteNonQuery执行您的查询,并返回-1,因为您的语句是SELECT语句。

  

对于UPDATE,INSERT和DELETE语句,返回值为   受命令影响的行数。当a上存在触发器时   正在插入或更新的表,返回值包括数字   受插入或更新操作影响的行数和数字   受触发器或触发器影响的行数。 适用于所有其他类型的   语句,返回值为-1

您可以使用DataRowCollection.Count property之类检查数据表行数

if(dt.Rows.Count > 0)
{
    ListViewWebsite.DataSource = dt;
    ListViewWebsite.DataBind();
}
else
{
    LabelWebsite.Visible = false;
}

除此之外,请使用using statement来处置您的SqlConnectionSqlCommand,而不是手动调用.Close()方法。

using(SqlConnection conn = new SqlConnection(strCon))
using(SqlCommand cmd = conn.CreateCommand())
{
   //
}

不要使用AddWithValue方法。 可能有时会产生意外结果。使用.Add()方法或它的重载。

答案 2 :(得分:0)

试试这个

da.Fill(dt);
if(dt.Rows.Count>0)
{

LabelWebsite.Visible = false;
}

答案 3 :(得分:0)

如果您使用的是dataadapter,则只需要这个:

SqlConnection conn = new SqlConnection(strCon);
SqlCommand cmd = new SqlCommand("SELECT url, websiteId FROM Website WHERE name LIKE @search + '%' OR url LIKE @search + '%'", conn);
conn.Open();
cmd.Parameters.AddWithValue("@search", search);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);

在da.Fill之后放置一个断点,然后使用调试器查看dt变量。

答案 4 :(得分:0)

如果您真的有兴趣只知道是否有行,还有另一种选择。

string cmdText = @"IF EXISTS(SELECT 1 FROM Website 
                    WHERE name LIKE @search 
                    OR url LIKE @search) 
                    SELECT 1 ELSE SELECT 0";
using(SqlConnection conn = new SqlConnection(strCon))
using(SqlCommand cmd = new SqlCommand(cmdText, conn)
{
    conn.Open();
    cmd.Parameters.AddWithValue("@search", search + "%");
    int exists = Convert.ToInt32(cmd.ExecuteScalar());
    LabelWebsite.Visible = (exists == 1);
}

此方法不会尝试返回行及其值。如果与WHERE子句匹配的行存在与否,它只返回1,