2016-01-20 53 views
0

我運行下面的查詢SQL命令C#沒有得到正確的結果

​​

當我查看notIn值並複製此查詢我得到我的數據庫空的結果(這是我很期待) 。但是,當我運行這個代碼時,我得到了6個結果。 notIN的內容例如

string notIn = "'201619011124027899693E8M2S3WOCKT9G6KHE11' ,'201619011124027899693E8M2S3WOCKT9G6KHE12'" 

SELECT * 
FROM addresses 
WHERE identifier NOT IN(@notIn) 

組合應該建立

SELECT * 
FROM addresses 
WHERE identifier NOT IN ('201619011124027899693E8M2S3WOCKT9G6KHE11', 
         '201619011124027899693E8M2S3WOCKT9G6KHE12') 

其運行正常。

回答

0

它應該是這樣的:

cmd = new SqlCommand(string.Format("SELECT * FROM addresses WHERE identifier NOT IN({0})", notIn), _connector.getMsConnection()); 

這樣notIn的值將Concat的到你的查詢字符串。

+0

謝謝你的工作! –

+0

請標記爲答案。樂於幫助。 :) –

-1

這是因爲,你通過了@notIn整個字符串,這意味着,SQL服務器把它看作:

SELECT * FROM addresses WHERE identifier NOT IN('''201619011124027899693E8M2S3WOCKT9G6KHE11'',''201619011124027899693E8M2S3WOCKT9G6KHE12''') 

所以你得空的結果

嘗試改變「不」 where子句和生成C#的地方:

string selectStatement = "SELECT * FROM addresses WHERE"; 
selectStatement += " identifier != '201619011124027899693E8M2S3WOCKT9G6KHE11' and identifier != '201619011124027899693E8M2S3WOCKT9G6KHE12'"; 

或者,如果你真的想用參數化的SQL,嘗試在存儲過程中做這件事吧。

+0

Downvotes是可以的,但請解釋它的原因。 – User2012384

0

與其他答案所說的相反,連接字符串以構建SQL是個壞主意,尤其是,因爲輸入值是字符串。你打開自己的SQL注入攻擊。

您應該爲列表中的每個項目生成多個參數。

例如,如果你輸入的輸入:

var notIn = new[] { "A1", "B2", "C3" } 

你想要的東西像

for(var i = 0; i < notIn.Length; i++) 
    command.AddParamWithValue("p"+i, notIn); 

然後你就可以建立與串聯的SQL(注意,我們不是串聯一個輸入這裏)

var sql = "SELECT * FROM addresses WHERE identifier NOT IN(" + string.Join(",", notIn.Select(i,v) => { "@p" + i; }) + ")"; 

w ^那麼看起來像:

SELECT * FROM addresses WHERE identifier NOT IN (@p0,@p1,@p2) 

或者,您可以將值轉儲到臨時表中並進行連接。

請注意,上面是僞代碼,可能不會編譯逐字,但應該給你正確的想法如何進行。

相關問題