У меня ошибка при выполнении 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