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 + ")"); 
4

2 に答える 2

3

主にデータ変換をデータベースに残すことを避け、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呼び出しでは先頭のスペースが削除されることに注意してください。これが問題の原因であると思われます。

于 2011-06-08T06:47:42.143 に答える
0

文字列変数widthheight. Trim()文字列を整数にキャストする前に、文字列に対してメソッドを呼び出します。

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

お役に立てれば。我々に教えてください。

于 2011-06-08T06:56:02.000 に答える