无法删除SQL Server Compact Edition中具有条件的数据

时间:2016-03-15 04:07:16

标签: c# sql-server-ce

我正在使用SQL Server Compact Edition。我尝试在最大日期从数据库中删除数据,我尝试查询它完美地工作,但是当我在我的程序中执行时,转向删除所有数据,而不是基于我创建的查询。

这是我的代码

string sqlCom="";
sqlCom = " delete from " + tableName; ;
sqlCom += " where messageid not in(";
sqlCom += " select messageid from tabmessageinclient";
sqlCom += " where convert(nvarchar(10),dtmessagetime,101) ";
sqlCom += " in (select max(convert(nvarchar(10),dtmessagetime,101)) from        tabmessageinclient ))";

SqlCeConnection ceCon = new     SqlCeConnection(Properties.Settings.Default.MyConnection);

if (ceCon.State == System.Data.ConnectionState.Open)
{ ceCon.Close(); }

ceCon.Open();
SqlCeCommand cmd = new SqlCeCommand();
cmd.Connection = ceCon;
cmd.CommandText = sqlCom;
cmd.ExecuteNonQuery();

有没有人知道我的代码有什么问题,对不起英文不好

1 个答案:

答案 0 :(得分:0)

我建议单独触发所有子查询一次,以确认这些子查询返回正确的数据集。即按以下顺序

select max(convert(nvarchar(10),dtmessagetime,101)) from tabmessageinclient
select messageid from tabmessageinclient where convert(nvarchar(10),dtmessagetime,101) in (select max(convert(nvarchar(10),dtmessagetime,101)) from tabmessageinclient)

如果返回预期的数据集,则验证第二个命令是否为messageid提供任何空值。当我们不使用时,如果任何选择值为null,它往往不会带回任何东西。在这种情况下,最好在子查询中使用另一个和条件。

where messageid is not null

您可以在SQL NOT IN not working

上详细了解此行为

好奇是否有使用字符串连接的特殊原因?您可能还想使用逐字字符串(和字符串格式),以便您的查询更清晰。

string sqlComm = string.format(@"delete from {0} where messageid not in 
(select messageid from tabmessageinclient where convert(nvarchar(10),dtmessagetime,101) in
(select max(convert(nvarchar(10),dtmessagetime,101)) from tabmessageinclient))", tableName);