2017-08-10 8 views
3

このエラーが発生しています。理にかなっていないのは、結果がまだ名前フィールド以外のすべてのフィールドが正しいデータベースにポストされているということです。名前フィールドに何らかの理由で 'dmInfo'と入力します。クローズドデータセットでこの操作を実行できず、テーブルに不正なデータが入力されています

with dmQuery_u.dmInfo do 
     begin 
     dsInfo.Edit; 
     qryData.SQL.Clear; 
     qryData.SQL.Add('SELECT * FROM eventinfo ORDER BY eventnumber'); 
     qryData.Open; 
     qryData.Last; 
     autonum := qryData['eventnumber'] + 1; 
     qryData.SQL.Clear; 
     qryData.SQL.Add(
      'INSERT INTO eventinfo (eventnumber, bandname, venue, dateofevent, ticketcost, openingact, amountbooked)'); 
     qryData.SQL.Add(
      'VALUES (:eventnumber, :bandname, :venue, :dateofevent, :ticketcost, :openingact, :amountbooked)'); 
     qryData.Parameters.ParamByName('eventnumber').Value := autonum; 
     qryData.Parameters.ParamByName('bandname').Value := name; 
     qryData.Parameters.ParamByName('venue').Value := venue; 
     qryData.Parameters.ParamByName('dateofevent').Value := date; 
     qryData.Parameters.ParamByName('ticketcost').Value := ticketcost; 
     qryData.Parameters.ParamByName('openingact').Value := openingact; 
     qryData.Parameters.ParamByName('amountbooked').Value := amountbooked; 
     qryData.ExecSQL; 
     qryData.SQL.Clear; 
     qryData.SQL.Add('SELECT * FROM eventinfo'); 
     qryData.Last; 
     qryData.Open; 
+0

閉じたデータセットでこの操作を実行できない場合は、通常、閉じたデータセットに対して実行しようとしている操作が示されます。 'qryData.Last; qryData.Open; '疑わしいと思われます。 – nil

+0

あなたがしようとしているのは、EventNumの既存の値の最大値を取得し、新しい行に対して1を追加することです。これはひどく非効率的で、エラーを起こしやすい方法です。どのバックエンドサーバーを使用していますか? – MartynA

+0

はい、これを行う一般的な方法は、自動インクリメントインデックスフィールドを使用することです。 –

答えて

2

あなたのエラーは、ここで発生している:コマンド:

qryData.ExecSQL; 
qryData.SQL.Clear; 
qryData.SQL.Add('SELECT * FROM eventinfo'); 
qryData.Last; { !! should be after ---v } 
qryData.Open; { should be first ---^ } 

.ExecSQLを呼び出すには、非クエリ(返さないレコードIE)を実行します。ここに有効なデータセットがないので、.Lastを呼び出すとエラーが発生します。最初に.Openに電話する必要があります。 dmInfoに移入あなたnameフィールドの第二の問題について、あなたはここに危険なwith文を使用して見破られている

ここ
with dmQuery_u.dmInfo do 
    {...} 
    qryData.Parameters.ParamByName('bandname').Value := name; 

with文はあなたがしたいname変数を隠しています代わりにdmQuery_u.dmInfo.Nameと解釈しています。 withステートメントを取り除き、明示的な修飾子をすべて使用するか、name変数の名前を変更してください。

+0

'with'ステートメントを使用しないようにコードを変更することをお勧めしますか? –

+0

@PhilipEllisこれは、 'name'変数の名前を変更するか、変更します。 'with'ステートメントの主題は、いくつかの強い意見の問題です。有効なユースケースがありますが、一般に 'with'ブロックが大きくなり始めると、このようなスコープエラーの確率は増加する傾向があります。 –

関連する問題