2012-04-13 23 views
0

我有一個簡單的應用程序,它具有的RichTextBox和按鈕。 用戶將數字(整數)輸入到richTextBox(每行一個數字)。轉換列表中的SQL二進制(8)名單

當他點擊我要生成一個SQL查詢的按鈕。

基本上它的工作原理如果我通過整數到查詢這樣的:

SELECT price from products where ID IN (1, 2, 3, 4) 

這是用戶輸入如1,2,3,4 RichTextBox中線路時。

但我想傳遞的二進制(8),而不是整數。

這是我原來的代碼行:

cmdString += " IN (" + string.Join(", ", richTextBox1.Lines) + ") "; 

我試圖與LINQ改變這樣的:

cmdString += " IN (" 
+ string.Join(", ", richTextBox1.Lines.Select(c => 
    { c = "0x"+Convert.ToString(Convert.ToInt32(c), 16); 
    return c; 
    }).ToArray()) 
+ ") "; 

我希望得到什麼:

例如轉換:

1 to 0x0000000000000001 
30 to 0x000000000000001E 

我希望你明白這一點。

更新:

我已經做到了這一點:

textBox1.Text = string.Join(", ", richTextBox1.Lines.Select(c => 
    { 
     c = "0x" + "0000000000000000".Substring(0, (16 - Convert.ToString(Convert.ToInt32(c), 16).Length)) + Convert.ToString(Convert.ToInt32(c), 16); 
     return c; 
    }).ToArray()); 

任何想法如何去除第二Convert.ToString(Convert.ToInt32(c))使用?或者也許以另一種方式做?

+3

「原始代碼行」也適用於SQL注入 – 2012-04-13 10:16:28

+0

如果我在MS SQL Server中做了簡單的選擇2005年領先0我得到我的結果,但沒有他們沒有:/ – Misiu 2012-04-13 10:19:04

回答

1

我會在foreach循環做到這一點:

var query = "Select ... In("; 

foreach(var item in Lines) 
{ 
    int a = 0; 
    if (!int.TryParse(item, out a)) 
    throw new IllegalInputException(); 
    query += "0x" + Convert.ToString(a, 16).PadLeft(16, '0'); 
} 
... 

或者你可以在你的LINQ查詢做,但不容易讀出的foreach一個:

cmdString += " IN (" 
+ string.Join(", ", richTextBox1.Lines.Select(c => 
    { c = "0x"+Convert.ToString(Convert.ToInt32(c), 16) 
       .PadLeft(16, '0'); 
    return c; 
    }).ToArray()) 

+ ") "; 
+0

這個作品就像我的解決方案,但它使用PadLeft。從未使用過了。謝謝:) – Misiu 2012-04-13 10:32:34

+0

有一個小錯誤。在PadLeft中,第一個參數必須是16而不是16的長度。第一個參數是我們結果字符串的總長度。 – Misiu 2012-04-13 11:00:00

+0

@米秀,謝謝,修正。 – 2012-04-13 12:22:53

0
var binaryStrings = richTextBox1.Lines 
        .Select(str => String.Format("'0x{0}'", 
            Convert.ToString(int.Parse(str), 16))); 
var cmd = String.Format("SELECT price from products where ID IN ({0})", 
            String.Join(",", binaryStrings)); 

Convert.ToString Method (Int32, Int32)

+0

它必須是16而不是8 :)第二件事是,我需要那些領先的0,沒有他們我的選擇不工作。我不知道爲什麼:/ – Misiu 2012-04-13 10:29:07

+0

@Misiu:我不明白。在'String.Format(''0x {0}'「'中添加了前導零。請注意,我添加了撇號,我認爲它不在SQL-Server中起作用,否則刪除它們,如果我錯了。改變了基底8到16 – 2012-04-13 10:36:13

+0

我試圖做一個簡單的選擇。如果我這樣做是這樣的:「SELECT * FROM其中ID = 0x0000000000000001產品」我得到我的結果,如果我刪除前導零我沒有得到任何記錄。Mayby是一些與我的SQL Server配置 – Misiu 2012-04-13 11:01:49