DELETE C # SqlCommand: подзапрос возвратил более 1 значения - PullRequest
0 голосов
/ 01 ноября 2018

У меня ошибка при выполнении DELETE или INSERT с использованием C # SqlCommand; база данных является сервером SQL.

SQL-оператор

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

что довольно просто.

id - это имя столбца с типом данных varchar(15), которое может быть NULL; some_id имеет 15 символов.

Сначала, чтобы убедиться, что существует только 1 строка с этим ID, был сделан этот запрос SELECT, который не возвращает ошибок

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

возвращает 1 строку

Ошибка на DELETE равна

System.Data.SqlClient.SqlException (0x80131904): подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

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

Эта ошибка может возникать, когда более 1 строки удовлетворяют критериям запроса; здесь явно не тот случай

Что удивительно, так это то, что при выполнении одного и того же запроса DELETE с использованием API C ODBC нет ошибки; так что, похоже, проблема в коде C #

C # код, который вызывает DELETE:

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;
}

C # код, который вызывает SELECT:

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

спасибо

EDIT

добавление ссылки на УДАЛИТЬ документацию

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...