查询总是在C#中返回-1

时间:2014-01-23 08:44:46

标签: c# sql-server

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

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();

但我总是在整数-1中获得CampaignExist。不知道我做错了什么。

5 个答案:

答案 0 :(得分:6)

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(*)不完全相同,您可以获得确切的行数。

答案 1 :(得分:1)

使用executioncalar方法并依靠查询

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();

答案 2 :(得分:1)

来自MSDN

  

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

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

答案 3 :(得分:1)

尝试使用执行标量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();

答案 4 :(得分:0)

ExecuteNonQuery不用于检索结果

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

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

  2. DataAdapter.Fill