簡體   English   中英

查詢始終在C#中返回-1

[英]Query is always returning -1 in C#

我正在使用以下代碼來檢查記錄是否存在。

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 不知道我在哪里做錯了。

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(*)不完全相同。

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

MSDN

對於UPDATE,INSERT和DELETE語句,返回值是該命令影響的行數。 當要插入或更新的表上存在觸發器時,返回值包括受插入或更新操作影響的行數以及受一個或多個觸發器影響的行數。 對於所有其他類型的語句,返回值為-1。 如果發生回滾,則返回值也為-1。

由於您的查詢是SELECT而不是上述UPDATEINSERTDELETE ,因此它將始終返回-1

嘗試執行scalar 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();

ExecuteNonQuery不用於檢索結果

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

  1. SqlCommand.ExecuteScalar (我希望這樣做)

  2. DataAdapter.Fill

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM