我遇到了一个奇怪的子串问题。显然,由于某些奇怪的原因,我得到的字符串不能被转换为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 :(得分: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
调用会删除任何前导空格,这似乎是导致问题的原因。
答案 1 :(得分:0)
字符串变量width
和height
中可能存在一些杂散空格。在将字符串转换为整数之前,在字符串上调用Trim()
方法:
width = width.Trim();
height = height.Trim();
希望这会有所帮助。请告诉我们。