[英]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
或使用諸如COUNT和ExecuteScalar的聚合函數
(如果只想獲取行數,可能是最好的選擇)
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
而不是上述UPDATE
, INSERT
或DELETE
,因此它將始終返回-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
不用於檢索結果
您可以使用以下方法之一:
SqlCommand.ExecuteScalar
(我希望這樣做)
DataAdapter.Fill
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.