2012-04-13 24 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