2

我有这段代码,它总是返回-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
4

5 回答 5

7

你应该

1)将您的 TSQL 更改为

 SELECT COUNT(*) FROM ReservationDetails WHERE ...

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

2)并使用ExecuteScalar()

noRows = (int) slct.ExecuteScalar();

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

综上所述,最好创建一个存储过程,给定您的参数,自动测试并插入表中,1如果成功则返回,或者0如果该行已经存在。

于 2012-04-07T08:42:14.063 回答
7

您是否阅读过 的文档SqlCommand.ExecuteNonQuery

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

你的查询是SELECT。

于 2012-04-07T08:42:32.540 回答
2

最好在单个查询中执行此操作,这样您就不需要两次请求服务器。

创建一个这样的过程并从代码中调用它。

IF EXISTS (SELECT 1 from ReservationDetails WHERE rID=@rID AND RNumber=@RNumber)
BEGIN
 insert into ReservationDetails values(@rID,@RNumber)
END
于 2012-04-07T08:47:35.920 回答
2

根据微软:

You can use the ExecuteNonQuery to perform catalog operations (for example, querying the structure of a database or creating database objects such as tables), or to change the data in a database without using a DataSet by executing UPDATE, INSERT, or DELETE statements.

您可能需要的是 ExecuteScalar 而不是 ExecuteNonQuery 并将 COUNT 放入您的选择查询中。

IE

SqlCommand slct = new SqlCommand("SELECT COUNT(*) FROM ReservationDetails WHERE   rID=@rID AND RNumber=@RNumber", conn);

另外,尽量使用 C# 中的 using 语句,这样即使失败,您也不必担心手动关闭连接。

IE

using (SqlConnection conn = new SqlConnection(connString))
{
    SqlCommand cmd = new SqlCommand(sql, conn);
    try
    {
        conn.Open();
        newProdID = (Int32)cmd.ExecuteScalar();
    }
    catch (Exception ex)
    {
        //Do stuff
    }
}

请参阅:http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx

于 2012-04-07T08:48:45.237 回答
1

@尼克纳特拉

当你使用

选择命令

它将返回您的值。哪个可以被使用

数据集或 SqlDataReader

command.ExecuteNonQuery()

仅在您使用时使用

Insert , Update , Delete行在表中生效的位置

是的,如果您确实想知道查询中有多少记录。你可以执行

a)修改您的查询“从表中选择计数(*)”

你只会得到一个值,即。行数。

b) 使用此查询执行命令。ExecuteScalar() 将仅返回第一行和第一列,即行数

因此,这满足了您的要求。

干杯!!

于 2012-04-07T08:54:52.333 回答