我正在使用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();
有没有人知道我的代码有什么问题,对不起英文不好
答案 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
上详细了解此行为
好奇是否有使用字符串连接的特殊原因?您可能还想使用逐字字符串(和字符串格式),以便您的查询更清晰。
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);