删除C#SqlCommand:子查询返回的值超过1个

时间:2018-11-01 20:19:43

标签: c# sql sql-server-2016 sqlcommand

我使用C#DELETE执行INSERTSqlCommand时出错;数据库是SQL Server。

SQL语句是

DELETE FROM [table_name] 
WHERE id = 'some_id';

这很简单。

id是数据类型为varchar(15)的列名,可以为NULL; some_id有15个字符。

首先,要验证仅存在带有ID的一行,请进行此SELECT查询,该查询不返回错误

SELECT * 
FROM [table_name] 
WHERE id = 'some_id';

返回1行

DELETE上的错误是

  

System.Data.SqlClient.SqlException(0x80131904):子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

     

在System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

当多于1行满足查询条件时,可能会发生此错误;显然不是这里

令人困惑的是,使用C ODBC API进行相同的DELETE查询不会出错;所以似乎问题出在C#代码中

调用DELETE的C#代码:

public int execute(string sql)
{
    SqlConnection conn = new SqlConnection(conn_str);

    try
    {
        conn.Open();

        SqlCommand command = new SqlCommand(sql, conn);
        command.ExecuteNonQuery();
        conn.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        return -1;
    }

    return 0;
}

调用SELECT的C#代码:

public List<List<string>> select(string sql)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();

    List<List<string>> rows = null;
    SqlConnection conn = new SqlConnection(conn_str);

    try
    {
        conn.Open();

        SqlDataReader reader = null;
        SqlCommand command = new SqlCommand(sql, conn);
        reader = command.ExecuteReader();

        int nbr_cols = reader.FieldCount;
        int nbr_rows = 0;

        rows = new List<List<string>>();

        while (reader.Read())
        {
            nbr_rows++;
            List<string> col = new List<string>();

            for (int idx_col = 0; idx_col < nbr_cols; idx_col++)
            {
                 string str = reader[idx_col].ToString();
                 col.Add(str);
            }

            rows.Add(col);
        }

        reader.Close();
        conn.Close();

        sw.Stop();

        Console.WriteLine("Time to get {0} rows: {1} msec", nbr_rows, sw.ElapsedMilliseconds);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }

    return rows;
}

C ++删除代码没有错误

std::string sql = "DELETE FROM [some_table] WHERE ID='some_id';";
  if (query.exec_direct(sql) < 0)
  {
    std::cout << sql;
  }

函数exec_direct在此处

https://github.com/pedro-vicente/lib_odbc/blob/master/odbc.cc

谢谢

编辑

添加指向DELETE文档的链接

https://docs.microsoft.com/en-us/sql/t-sql/statements/delete-transact-sql?view=sql-server-2017

0 个答案:

没有答案