2016-03-15 73 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); 
相關問題