• 締切済み

VB6.0 の主キーの上書き処理について

いつもお世話になっております。 VisualBasic6.0の勉強をしています。 Text1、Text2、Commmand1 を配置したフォームを作成し、 Text1に番号、Text2に名前、を入力後、 Command1ボタンを押すと、 MySQLサーバにデータが登録される処理を作成しているのですが、 下記のプログラムでは登録は出来るのですが、 サーバ側で、主キーはText1で入力した番号にしているため、 サーバ側で登録済みの番号を入力し登録処理を行った際、 『実行時エラー'2147467259 プライマリー重複のエラーメッセージ』 が表示されます。 主キーを上書きする際は、どのような処理を加えればよいのでしょうか? Private Sub Command1_Click()  Dim cn As ADODB.Connection  Dim rs As ADODB.Recordset   Set cn = New ADODB.Connection   Set rs = New ADODB.Recordset  Dim strTBL As Variant   strTBL = "test" 'テーブル名   'Mysqlへ接続   cn.Open "Driver={MySQL ODBC 3.51 Driver};~略~   'テーブルを開く   rs.Open strTBL, cn, adOpenForwardOnly, adLockOptimistic, adCmdTable rs.AddNew       '新規レコードを追加   rs!no = Text1.Text           'ナンバーをセット   rs!Name = Text2.Text          '名前をセット  rs.Update       '更新(保存)  rs!no = Text1.Text           'ナンバーをセット  rs!Name = Text2.Text          '名前をセット  cn.Close  Set cn = Nothing  Set rs = Nothing  MsgBox "登録完了", vbOKOnly, "登録"     Text1.Text = ""            '登録後、テキストの内容を消去  Text2.Text = "" End Sub ご教示、よろしくお願いいたします

みんなの回答

noname#245936
noname#245936
回答No.4

No.1の者です。 そうそう、ADO、ADO.NETのややこしいところは、やりたいことを 実現する際に、いくつか複数のやり方があることです。 貴方がおっしゃるやり方。 Recordsetオブジェクトを使って、AddNew、Update、Delete。 表をあたかも簡単に操作する方法。 これも、やり方でありはありなんですがね。 この技の欠点は、レコードセットが1つの表参照しかできないこと。 データベースサーバから、データを取ってきて見たい時。 普通は、SQL構文というのを書いて…これがとっても便利な構文で。 書き方によっては一撃で欲しいデータをほかのとくっつけたり、 計算したり、集計したりした結果を引っ張り出すことができます。 例えば、そのお店で、お客様年齢別に、どういったジャンルの商品が 売れている傾向があるかなどを取ってくるとき。 strSQL = "Select …こないして、どうして、集計データを取れ" Rs.Open strSQL とすると、複雑なデータが一撃でとってこれるのですが。 このやり方は、高速で便利な反面、加工された後のデータなので rs.addnewやdeleteなど再加工ができません。 よって、我々業務用でプログラムを書く場合は。 RecordSet = SELECT系のSQLを放るためのもので、データをとって       きて見せるもの。 Command = Update / Delete / Insertなど、個々のテーブルに対し      何らかの働きかけを行うもの。 という使い方が簡単明瞭で便利だったりします。 このコツの部分。 昔は、いい本が多かったのですが。 今は、Webでも変なこと教えているサイト多いですしね。 私が勉強したのは、ADO実践講座というマニアック本。 あと、秀和システムのVisualBasic?百の技シリーズ。 Microsoftの黄色本(教科書)。かな。 ま、とりあえず、最初は動かすのが肝心なので。 どんどんためして失敗してみましょう。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

コードのことばかり、質問に書いているが 既に在るテーブルの、ある主キーのレコードに対し、更新でない、新規データのつもりのデータがなぜ起こるのか。 初めからこの処理の情況を捉えて(データ作成側で、誤りが起こりえるのか)、 既に在るテーブルの 主キーにない場合は新規レコード追加、 ある場合は、エラーにするのか、更新レコードとして、属性的データを更新処理するのか? インプットデータの発生状況を良く捉えて対処しないとダメでしょう。 直ぐrs.AddNew  に取りかかってよいはずがない(質問者のコードはそういうコードではない?)。      

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.2

rs.AddNew   '新規レコードようの場所を用意する rs.Update    ’DBに書込む という感じ だから if shori="新規" then rs.addnew end if   rs!no = Text1.Text           'ナンバーをセット   rs!Name = Text2.Text          '名前をセット rs.Update    ’DBに書込み とする。 通常は更新(上書き 修正)のときは 事前に読んでることが多いのでキーになる部分はセットしなくても済む場合がおおいと思いますが。

noname#245936
noname#245936
回答No.1

うむむ。 既に、同じキーをもつデータがあるのに、同じデータをInsert系SQLで (ここではAddNew & Updateで)むりやり突っ込もうとしているから ダメかと…。 ここは、元データを更新すべく、Commandオブジェクトで、UPDATE文を 発行するか。 元データをいったん削除すべく、Commandオブジェクトで、DELETE文を 発行したあとで、追加を実行しましょう。 なお。 もっとおせっかいを言いますと。 1.Dim strTBL As Variant   Dim strTBL As String   これは、Stringのほうがメモリ少ないです。 2.テーブル指示は順序の保証がないのでご注意   テーブル名だけの指示ではDBはデータ順を保証しません。   SELECT文を書きましょう。とくに、ORDER BY句。   strTBL = "SELECT [Field Name] From [Table Name] ORDER BY [Field]" 3.正式プロパティ名記載のほうが速いかも   rs!FieldName の本名は   rs.Fields("FieldName").Value です。 4.rsがクローズしてません   rs.closeは必要ですね。 がんばってください。

noname#163990
質問者

補足

回答ありがとうございます。 >ここは、元データを更新すべく、Commandオブジェクトで、UPDATE文を >発行するか。 >元データをいったん削除すべく、Commandオブジェクトで、DELETE文を >発行したあとで、追加を実行しましょう。  rs.Update       '更新(保存)  rs!no = Text1.Text           'ナンバーをセット  rs!Name = Text2.Text          '名前をセット ここで更新処理をしているのだと思っていましたが、違うんですよね? UPDATE文とは、addnewの前に記入するのでしょうか? また、どのように記述すればよいのでしょうか? だいぶ煮詰まってきましたので、 参考となるようなサイトがあれば、教えていただければ幸いです。 なにとぞよろしくお願いいたします。

関連するQ&A