【问题标题】:Query is always returning -1 in C#查询在 C# 中总是返回 -1
【发布时间】:2014-01-23 08:44:45
【问题描述】:

我正在使用以下代码检查记录是否存在。

SqlCommand check_Campaign_Name = new SqlCommand("SELECT * FROM Campaign_Summary  WHERE ([Compaign_Name] = @user) ", conn);
check_Campaign_Name.Parameters.AddWithValue("@user", txtBox_LastClick_Campaign.Text);

int CampaignExist = check_Campaign_Name.ExecuteNonQuery();

richTextBox1.Text = CampaignExist.ToString();

但我总是在整数CampaignExist 中得到-1。不知道我哪里做错了。

【问题讨论】:

  • 您确定您的查询本身是正确的SELECT * FROM Campaign_Summary WHERE ([Compaign_Name] = @user)?请先在@user替换真实用户名进行测试
  • 你在查询中写了[Compaign_Name],不应该是[Campaign_Name]吗?

标签: c# sql-server


【解决方案1】:

ExecuteNonQuery 不应该返回 SELECTED 行数,而是返回由 INSERT/UPDATE/DELETE 命令修改的行数。您应该使用 SqlDataReader 并检查其属性 HasRows 或使用聚合函数,如 COUNTExecuteScalar
(如果您只想检索行数,这可能是最好的选择)

SqlCommand check_Campaign_Name = new SqlCommand("SELECT COUNT(*) FROM Campaign_Summary " + 
                                 "WHERE Compaign_Name = @user", conn);
check_Campaign_Name.Parameters.AddWithValue("@user", txtBox_LastClick_Campaign.Text);
int rowCount = Convert.ToInt32(check_Campaign_Name.ExecuteScalar());

但是,如果您只想知道该行是否存在,则认为COUNT 方法的效率低于使用EXISTS 语句的效率。

string cmdText = @"IF EXISTS (SELECT Compaign_Name FROM Campaign_Summary 
                   WHERE Compaign_Name = @user)
                   SELECT 1 ELSE SELECT O";
SqlCommand check_Campaign_Name = new SqlCommand(cmdText, conn);
int rowExists = Convert.ToInt32(check_Campaign_Name.ExecuteScalar());

第二种方法只允许知道是否存在符合 WHERE 语句的行。
所以它与COUNT(*) 不完全一样,您可以在其中获得确切的行数。

【讨论】:

    【解决方案2】:

    使用executescalar方法并依靠查询

    SqlCommand check_Campaign_Name = new SqlCommand("SELECT COUNT(1) FROM Campaign_Summary  WHERE ([Compaign_Name] = @user) ", conn);
    check_Campaign_Name.Parameters.AddWithValue("@user", txtBox_LastClick_Campaign.Text);
    
    int CampaignExist = Convert.ToInt32(check_Campaign_Name.ExecuteScalar());
    
    richTextBox1.Text = CampaignExist.ToString();
    

    【讨论】:

      【解决方案3】:

      来自MSDN

      对于 UPDATE、INSERT 和 DELETE 语句,返回值是受命令影响的行数。当正在插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也是-1。

      由于您的查询是SELECT 而不是提到的UPDATEINSERTDELETEs 之一,因此它将始终返回-1

      【讨论】:

        【解决方案4】:

        尝试使用执行标量MSDN

        int CampaignExist = Convert.ToInt(check_Campaign_Name.ExecuteScalar());
        

        SqlCommand check_Campaign_Name = new SqlCommand("SELECT COUNT(1) FROM Campaign_Summary  WHERE ([Compaign_Name] = @user) ", conn);
        check_Campaign_Name.Parameters.AddWithValue("@user", txtBox_LastClick_Campaign.Text);
        
        int CampaignExist = Convert.ToInt32(check_Campaign_Name.ExecuteScalar());
        
        richTextBox1.Text = CampaignExist.ToString();
        

        【讨论】:

          【解决方案5】:

          ExecuteNonQuery 不用于检索结果

          您可以使用以下方法之一:

          1. SqlCommand.ExecuteScalar(我更喜欢这个)

          2. DataAdapter.Fill

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-01-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-11
            相关资源
            最近更新 更多