0

データベースからプロパティ グリッドにデータを取り込むアプリケーションに取り組んでいますが、通常はそのデータベースを編集できるはずです。

これは私のクラスの小さなプロトタイプです:

public partial class MonthlyData
{
    public MonthlyData(string month, string year)
    {
        this.key = string.Format("{0} {1}", month, year);

        _IncomeMarketing = GetEntry(EntryType.Income, "Comercializarea produselor");
    }

    private string key = "";

    #region Income Properties
    [CategoryAttribute("Venituri"),
     DisplayName("Comercializare de produse"),
     Description("Venituri din comercializrea de produse")]
    public double Income_Marketing
    {
        get { return _IncomeMarketing; }
        set { _IncomeMarketing = SetEntry(EntryType.Income, "Comercializarea produselor", value); }
    }
    #endregion

    private double _IncomeMarketing;
}

以下は my の定義ですSetEntry()

private double SetEntry(EntryType type, string entryName, double entryNewValue)
{
    string tableName = (type == EntryType.Income) ? "Venituri" : "Cheltuieli";

    OleDbConnection connection = new OleDbConnection(Properties.Settings.Default.AccountingServicesConnectionString);
    connection.Open();

    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = connection;
    cmd.CommandText = string.Format("UPDATE {0} SET {1} = {2} WHERE Luna = \"{3}\"", tableName, entryName, entryNewValue, this.key);

    cmd.ExecuteNonQuery(); // I think here is my problem!

    return entryNewValue;
}

下の画像は、2 つの異なる手順でのアプリケーションの印刷画面です。

  1. プロパティ グリッドはデータベースから正しい値を取得します
  2. そのプロパティを変更して ENTER を押すと、そのエラーが発生します...

ここに画像の説明を入力

どこに問題があるのか​​わからない。データベースのデータ型は問題ないため (それらはdouble)

私を助けるためにあなたに提供できることは何でも教えてください。前もって感謝します!

編集 ここで、プロジェクトに関する詳細情報を提供できます。これが私のプロジェクトが使用する.accdbファイルです。

4

2 に答える 2

1

最初に行うことは、調査できるように例外をキャッチすることです。usingおそらく同時にいくつかを追加します:

try {
    using(var connection = new OleDbConnection(Properties.Settings.Default.AccountingServicesConnectionString))
    using(var cmd = connection.CreateCommand())
    {
        connection.Open();
        cmd.CommandText = string.Format(
            "UPDATE {0} SET {1} = {2} WHERE Luna = \"{3}\"",
            tableName, entryName, entryNewValue, this.key);

        cmd.ExecuteNonQuery(); // I think here is my problem!

        return entryNewValue;
    }
} catch(Exception ex) {
     SomeGlobalLogging(ex); // <=== put breakpoint here
     throw;
}

次に、次のことを確認できます。

cmd.CommandText = string.Format(
    "UPDATE {0} SET {1} = {2} WHERE Luna = \"{3}\"",
    tableName, entryName, entryNewValue, this.key);

これには、少なくとも 10 進数指定子 (コンマとピリオド) の書式設定の問題など、さまざまな問題が発生する可能性があります。少なくとも値にはパラメーターを使用する必要があります(テーブル/列名をパラメーター化することはできません)。IMO、{2} および {3} はパラメーターになる必要があります:

cmd.CommandText = string.Format(
    "UPDATE {0} SET {1} = :newVal WHERE Luna = :key", tableName, entryName);
cmd.Parameters.AddWithValue("newVal", entryNewValue);
cmd.Parameters.AddWithValue("key", this.key);
于 2013-08-12T08:45:34.707 に答える
0

このコードブロックにより、クエリが機能しました。

テーブル名と列名を括弧で囲む必要がありました。

string tableName = (type == EntryType.Income) ? "Venituri" : "チェルトゥイエリ";

try
{
    using (var connection = new OleDbConnection(Properties.Settings.Default.AccountingServicesConnectionString))
    using (var cmd = connection.CreateCommand())
    {
        connection.Open();
        cmd.CommandText = string.Format("UPDATE [{0}] SET [{1}] = ? WHERE [Luna] = ?", tableName, entryName);
        cmd.Parameters.AddWithValue("?", entryNewValue);
        cmd.Parameters.AddWithValue("?", this.key);

        cmd.ExecuteNonQuery();

        return entryNewValue;
    }
}
catch (Exception ex)
{
    Debug.WriteLine(ex); // <=== put breakpoint here
    throw;
}
于 2013-08-12T09:50:00.397 に答える