Странная проблема с приведением подстроки к целому числу - PullRequest
0 голосов
/ 08 июня 2011

У меня странная проблема с подстрокой.Очевидно, что полученная мной строка не может быть преобразована в 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 + ")"); 

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

По всем обычным причинам - в первую очередь избегая преобразования данных в базу данных и предотвращая атаки SQL-инъекций - я бы посоветовал вам выполнить синтаксический анализ числа в C #, а затем использовать параметризованный запрос поговорить с 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 голосов
/ 08 июня 2011

В строковых переменных могут быть некоторые случайные пробелы width и height. Вызвать метод Trim() для строк перед приведением их к целым числам:

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

Надеюсь, это поможет. Дайте нам знать.

...