C# - SELECT查询受影响的行数始终为-1

NiC*_*iCU 2 c# sql-server

我有这个代码,它总是返回-1.我有三个表(图片更具暗示性): 在此输入图像描述

我想看看该行是否已经在ReservationDetails表中,如果它不是要插入它.

try
        {
            SqlConnection conn = new SqlConnection... 
            SqlCommand slct = new SqlCommand("SELECT * FROM ReservationDetails WHERE rID=@rID AND RNumber=@RNumber", conn);
            slct.Parameters.AddWithValue("@rID", (int)comboBox1.SelectedValue);
            slct.Parameters.AddWithValue("@RNumber", dataGridView1.SelectedRows[0].Cells[0].Value);

            int noRows;//counts if we already have the entry in the table
            conn.Open();
            noRows = slct.ExecuteNonQuery();
            conn.Close();
            MessageBox.Show("The result of select="+noRows);

            if (noRows ==0)    //we can insert the new row
Run Code Online (Sandbox Code Playgroud)

Mit*_*eat 7

你应该

1)将您的TSQL更改为

 SELECT COUNT(*) FROM ReservationDetails WHERE ...
Run Code Online (Sandbox Code Playgroud)

(更好的是,使用IF EXISTS...)

2)并使用ExecuteScalar():

noRows = (int) slct.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)

另外:您需要使用事务(或其他一些原子技术),否则有人可能会在您测试和尝试插入之间插入一行...

所有这一切,最好创建一个存储过程,给出您的参数,原子测试并插入表中,1如果成功返回,或者0行已经存在.


lam*_*pak 7

你看过文件了SqlCommand.ExecuteNonQuery吗?

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

你的查询是SELECT.

  • @nickNatra:您希望查询会影响*多少行?查询不会*影响*任何东西 - 它只是查询. (2认同)