2016-03-15 112 views
0

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

使用@符号在多行上写字符串,目前这对我来说是不可读的。也尝试格式化您的查询... – mybirthname

+0

[SQL注入警报](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 你应该**不**将您的SQL语句连接在一起 - 使用**参数化查询**来避免SQL注入 –

回答

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) 

如果返回预期的数据集,然后验证如果第二命令给出任何空值信息id。当我们不使用时,如果任何选择值为空,它往往不会返回任何东西。在这种情况下,最好在子查询中使用另一个条件。

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); 
相关问题