1

他の目的で、巨大なデータベースを oracle データソースから mysql データソースに同期しています。Linux/Oracle データベースで PuTTY を使用してデータを読み取る場合、値は

8888888888

これはオブジェクトに格納され、MySQL に挿入され、最終的には

00000000000000000000000000000000000000000000000000000000000000000000008888888888

残念ながら、私はプログラミングのヒーローではなく、問題を理解できないようです。両方のデータベースのデータ型は int(10) であり、C# アプリケーションが値を改ざんすることはありません。実際のエラー メッセージは次のとおりです (ステートメントの無関係な部分は省略されています)。

Error while executing query 
INSERT INTO tsdsmd(kode8) 
VALUES ('00000000000000000000000000000000000000000000000000000000000000000000008888888888')
Out of range value for column 'kode8' at row 1

文字セットの不一致でしょうか?

これは挿入コマンドを構築するコードです

public int Insert(string table, string[] fields, object[] values)
{
    if (fields.Length != values.Length)
        throw new DBException("Field lengt is not equal to values length!");

    StringBuilder query = new StringBuilder();
    query.Append("INSERT INTO ");
    query.Append(table);
    query.Append("( ");
    for (int i = 0; i < fields.Length; i++)
    {
        query.Append(fields[i]);

        if (i != fields.Length - 1)
        {
            query.Append(", ");
        }
    }

    query.Append(") VALUES (");

    for (int i = 0; i < fields.Length; i++)
    {
        query.Append("@" + fields[i]);

        if (i != fields.Length - 1)
        {
            query.Append(", ");
        }
    }

    query.Append(")");

    DBCommand command = new DBCommand(query.ToString());

    for (int i = 0; i < fields.Length; i++)
    {
        command.AddParameter("@" + fields[i], values[i]);
    }

    return Insert(command);
}

編集; コードの一部を変更し、別の try catch を使用している間、これらの行をスキップしています。見てください、これが私が見ているものです。値は int の範囲内にある必要があり、私はとても混乱しています。潜在的なバグ?int32にはintが小さすぎるか大きすぎるというエラーが表示されます。そうであってはなりません。 コードのスクリーンショット

4

2 に答える 2

1

これは、パラメーターを追加するときに値を明示的にキャストする必要があるように見えます。コードが挿入しようとしている値は、データ型が正しくなく、ゼロが埋め込まれていますが、技術的には正しいです。これを行うと、問題が解決するはずです。

command.AddParameter("@" + fields[i], (int)values[i])

確かに、複数のデータ型を動的に処理しようとしている場合、これは少し面倒ですが、値の適切なデータ型を把握するためにいくつかのテストを追加するのはそれほど難しいことではありません。

于 2013-03-07T16:08:46.733 に答える
0

実際、Oracle の列は、mysql の "int" のように int32 によって制限されていません。mysql 列を int64/long に変換する必要があります。

于 2013-03-08T11:09:40.733 に答える