2011-06-08 72 views
0

我收到一个奇怪的问题与子串。很显然,我得到的字符串由于某种奇怪的原因无法投射到Int32中。我尝试这样做时出现的错误消息是“输入字符串格式不正确”。因此,我不能将这些值插入到数据库中。铸造子字符串整数奇怪的问题

下面的代码...

string width = GetMetadata(filename, 162); //returns "1280 pixels" 
string height = GetMetadata(filename, 164); //returns "700 pixels" 
width = width.Substring(0, width.IndexOf(' ')); //returns "1280" 
height = height.Substring(0, height.IndexOf(' ')); //returns "700" 

//test: "System.Convert.ToInt32(width)" will fail, giving error "input string was not in correct format" 
//doing the above on "width" yields the same result 

//fails, giving error "no such column: 1280" (underlying database is sqlite)    
Database.NonQuery("INSERT INTO image VALUES (" + fileid + ", " + width + ", " + height + ")"); 
+0

你已经在那里放了一个断点,并绝对验证了'GetMetadata()'返回的值是你期望的吗?没有多余的空间?没有标签或其他不正确的空格?由于值“1280像素”和“700像素”,该代码工作正常。 – Carson63000 2011-06-08 06:42:47

+0

@Carson:是的,评论中的值正是我所得到的。如果情况并非如此,我会仔细检查并回复。 – rafale 2011-06-08 06:45:57

+0

首先 - 在使用数据库时更好地使用参数。开发机器上的当前文化是什么? – vityanya 2011-06-08 06:49:41

回答

3

对于所有正常的原因 - 主要是避免使数据转换到数据库中,并防止SQL注入攻击 - 我会建议你在完成解析的数量C#,然后使用parameterized query与SQLite交谈。

在这种情况下,这将使它更容易调试 - 或者.NET也无法解析字符串(在这种情况下,它可能是数据的问题),或者它会起作用,而你不需要担心数据库转换的性能。

编辑:我刚刚看到您的评论说Convert.ToInt32失败。这是一个非常明显的迹象表明,这是导致问题的数据。

我期望你的代码看起来是这样的:

string widthText = GetMetadata(filename, 162); 
string heightText = GetMetadata(filename, 164); 
widthText = width.Substring(0, width.IndexOf(' ')).Trim(); 
heightText = height.Substring(0, height.IndexOf(' ')).Trim(); 

int width = int.Parse(widthText, CulutureInfo.InvariantCulture); 
int height = int.Parse(widthText, CulutureInfo.InvariantCulture); 

using (SQLiteCommand cmd = Database.CreateCommand()) 
{ 
    cmd.CommandText = "INSERT INTO image VALUES (?, ?, ?)"; 
    cmd.Parameters.Add(fileid); 
    cmd.Parameters.Add(width); 
    cmd.Parameters.Add(height); 
    cmd.ExecuteNonQuery(); 
} 

注意,Trim通话将删除任何前导空格,这似乎是问题的原因。

+0

这个问题已经解决了,所以我要在这里切线。除了防止注入攻击之外,使用参数化查询而不是普通查询有什么优势吗?目前,我只使用参数化查询,其中需要将用户输入插入到数据库中。 – rafale 2011-06-08 07:07:20

+2

@rafale:它将* code *(SQL)从* data *(values)中分离出来。这意味着您可以真正干净地从代码中分离出数据......以及避免在代码中以非字符串形式获取数据时发生数据库中的转换。这在传输类似日期的日期时尤为重要,其中显然有几种不同的表示日期的格式。 – 2011-06-08 07:10:07

+1

我认为在不处理用户输入时使用非参数化查询是不好的做法。然后,每次查看查询时,都必须问自己:“嘿,这是非参数化的,我相信即使在将来也不会看到用户的输入吗?” – Brian 2011-06-08 19:26:45

0

字符串变量widthheight中可能有一些空白空格。他们铸造成整数调用之前在琴弦上Trim()方法:

width = width.Trim(); 
height = height.Trim(); 

希望这有助于。让我们知道。