0

プライベート int DBUpdate() {

DAL dal = new DAL();
string upd = "UPDATE [RPform] SET [ProjectName] = '@pname', [ProjectCode] = '@pcode', [Country] = @cnt, ";
upd += "[StartDate] = '@startdate', [FinishDate] = '@finishdate', [TotalParticipants] = @totpart, [ArrivalDate] = '@arrivedate', ";
upd += "[AirportTransfer] = @airtran, [AirportDate] = '@airdate', [AirportHours] = @airhour, [AirportMinutes] = @airmin, ";
upd += "[Problems] = '@problems', [FirstDayActivities] = '@fdayact' ";
upd += "WHERE [UserID]=@usid";

    OleDbParameter[] parm = new OleDbParameter[] { 
    new OleDbParameter("@pname",projname.Text),
    new OleDbParameter("@pcode",projcode.Text),
    new OleDbParameter("@cnt",countries.SelectedIndex),
    new OleDbParameter("@startdate",datestart.Text),
    new OleDbParameter("@finishdate",datefinish.Text),
    new OleDbParameter("@totpart",totalparticipants.Text),
    new OleDbParameter("@arrivedate",datearrival.Text),
    new OleDbParameter("@airtran",RadioButtonList1.SelectedValue),
    new OleDbParameter("@airdate",dateairport.Text),
    new OleDbParameter("@airhour",airporthours.SelectedIndex),
    new OleDbParameter("@airmin",airportminutes.SelectedIndex),
    new OleDbParameter("@problems",problems.Value),
    new OleDbParameter("@fdayact",firstday.Value),
    new OleDbParameter("@usid",user.ID)
    };
 return (dal.UpdateRow(upd,false,parm));
}

/// 例外は発生しませんが、影響を受けた 0 行を返します。MS Access 内から同じクエリを実行すると、正常に動作します。したがって、問題はパラメーターの処理にあると思います...しかし、何ですか?ありがとうございました


Sergio: OleDbTypes を明示的に設定するために、これでよろしいですか?

///whatever ...
        new OleDbParameter("@problems",problems.Value),
        new OleDbParameter("@fdayact",firstday.Value),
        new OleDbParameter("@usid",user.ID)
        };
//then telling each one what they will be ... 
        parm[0].OleDbType = OleDbType.VarWChar;
        parm[1].OleDbType = OleDbType.VarWChar;

///
     return (dal.UpdateRow(upd,false,parm));
4

7 に答える 7

6

user.IDの値が正しく設定されているか確認してください。

updコマンド文字列では、次のようにパラメーターを引用符で囲みます

[StartDate] = '@startdate'

すべてのパラメーターでこれらの引用符を削除します。

于 2008-12-23T11:54:13.467 に答える
3

申し訳ありませんが、 OleDbプロバイダーを見落としていました。SQL プロバイダーを対象としている場合、SQL コマンド構文は正しいです。

したがって、コマンドは次のようになります。

string upd = "UPDATE [RPform] SET [ProjectName] = ?, [ProjectCode] = ?, [Country] = ?, ";
upd += "[StartDate] = ?, [FinishDate] = ?, [TotalParticipants] = ?, [ArrivalDate] = ?, ";
upd += "[AirportTransfer] = ?, [AirportDate] = ?, [AirportHours] = ?, [AirportMinutes] = ?, ";
upd += "[Problems] = ?, [FirstDayActivities] = ? ";
upd += "WHERE [UserID]=?";

次に、OleDb パラメーターを既に持っているのと同じように追加する必要がありますが、SQL コマンドに表示されるのと同じ順序で追加するように注意する必要があります。

もう 1 つ、問題とは関係ありませんが、文字列を連結するべきではありません。その操作はパフォーマンスの点であまり良くないからです。

代わりに、SQL コマンドを適切にレイアウトするには、次のようにしてください。

StringBuilder upd = new StringBuilder();
upd.Append("UPDATE [RPform] SET [ProjectName] = ?, [ProjectCode] = ?, [Country] = ?, ");
upd.Append("[StartDate] = ?, [FinishDate] = ?, [TotalParticipants] = ?, [ArrivalDate] = ?, ");
upd.Append("[AirportTransfer] = ?, [AirportDate] = ?, [AirportHours] = ?, [AirportMinutes] = ?, ");
upd.Append("[Problems] = ?, [FirstDayActivities] = ? ");
upd.Append("WHERE [UserID]=?");

次に、コマンド文字列を取得するには、次のものが必要です。

upd.ToString();

これがあなたを助けることを願っています。

于 2008-12-23T13:37:03.213 に答える
3

複数行の文字列リテラルを使用すると、連結するよりも読みやすく (コピー/貼り付けしやすく) なります。また、文字列パラメーターであっても、パラメーター名を一重引用符で囲まないでください (リテラルのみに一重引用符を使用してください)。したがって、元の SQL は次のようになります。

string upd = @"
UPDATE [RPform] SET [ProjectName] = @pname, [ProjectCode] = @pcode, [Country] = @cnt, 
[StartDate] = @startdate, [FinishDate] = @finishdate, [TotalParticipants] = @totpart, [ArrivalDate] = @arrivedate, 
[AirportTransfer] = @airtran, [AirportDate] = @airdate, [AirportHours] = @airhour, [AirportMinutes] = @airmin, 
[Problems] = @problems, [FirstDayActivities] = @fdayact 
WHERE [UserID]=@usid
";

他の人が指摘したように、OleDb は名前付きパラメーターを使用しないため、実際には以下を使用して、SQL ステートメントに表示されるのと同じ順序でパラメーターを OleDbCommand に追加する必要があります。

string upd = @"
UPDATE [RPform] SET [ProjectName] = ?, [ProjectCode] = ?, [Country] = ?, 
[StartDate] = ?, [FinishDate] = ?, [TotalParticipants] = ?, [ArrivalDate] = ?, 
[AirportTransfer] = ?, [AirportDate] = ?, [AirportHours] = ?, [AirportMinutes] = ?, 
[Problems] = ?, [FirstDayActivities] = ? 
WHERE [UserID]=?
";
于 2008-12-23T15:51:17.137 に答える
2

新しい OleDbParameter ごとにパラメーターの型を設定すると、SQL に一重引用符を付ける必要がなくなり、命令の入力ミスが少なくなります。

于 2008-12-23T11:52:22.987 に答える
2

この場合、StringBuilder を使用しないでください。適切にフォーマットされた SQL コードで逐語的な文字列 (@) を使用します。

var updateStatement = @"
    UPDATE [RPform]
    SET     [ProjectName]        = @pname     ,
            [ProjectCode]        = @pcode     ,
            [Country]            = @cnt       ,
            [StartDate]          = @startdate ,
            [FinishDate]         = @finishdate,
            [TotalParticipants]  = @totpart   ,
            [ArrivalDate]        = @arrivedate,
            [AirportTransfer]    = @airtran   ,
            [AirportDate]        = @airdate   ,
            [AirportHours]       = @airhour   ,
            [AirportMinutes]     = @airmin    ,
            [Problems]           = @problems  ,
            [FirstDayActivities] = @fdayact
    WHERE   [UserID]             =@usid";

ただし、+= は最適化されないことに注意する必要があります。単純な + はコンパイル時に実行されます。例えば

string s = "A" + "B" + C"; 

「ABC」のパフォーマンス ヒットはありませんが、

string s = "A" + variable + C";

最適化されません。

于 2008-12-23T16:38:13.283 に答える
1

ちなみに、updを作成するには、文字列の代わりにStringBuilderを使用することをお勧めします。+ =を使用するたびに、古い文字列を破棄して新しい文字列を作成します。

試す

StringBuilder upd = new StringBuilder();
upd.Append("UPDATE [RPform] SET [ProjectName] = '@pname', [ProjectCode] = '@pcode', [Country] = @cnt, ");
upd.Append("[StartDate] = '@startdate', [FinishDate] = '@finishdate', [TotalParticipants] = @totpart, [ArrivalDate] = '@arrivedate', ");
upd.Append("[AirportTransfer] = @airtran, [AirportDate] = '@airdate', [AirportHours] = @airhour, [AirportMinutes] = @airmin, ");
upd.Append("[Problems] = '@problems', [FirstDayActivities] = '@fdayact' ");
upd.Append("WHERE [UserID]=@usid");

そしてそれを使用するには、単に

upd.ToString();
于 2008-12-23T12:35:29.280 に答える
0

あっ!Deltron 3030を聞いて解決しました..常に機能します:)

この OleDbParameter オブジェクトは、(ctor へのオブジェクトとして) 渡した型に従って、その oledbtype を内部的に設定します .. そのため、TextBox からの整数を渡しました (クライアント側で検証済みですが、まだテキストであるため、クラッシュします) .. また、 bool one は radiobutton.Value .. True を送信しますが、テキストを送信するため、文字列として想定され、単一引用符でカプセル化されます...しかし、名前がないため、これらのパラメーターに付ける名前がわかりません...

申し訳ありませんが、私は長い記事を読むのが嫌いです.代わりに、怠惰であるプログラマーの偉大な美徳の1つを使用しています..だから私はここで尋ねます:)

皆さんの時間と努力に感謝します..皆さんの成功を祈っています

于 2008-12-23T16:16:06.683 に答える