我使用C#DELETE
执行INSERT
或SqlCommand
时出错;数据库是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