- 締切済み
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 ご教示、よろしくお願いいたします
- みんなの回答 (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)
コードのことばかり、質問に書いているが 既に在るテーブルの、ある主キーのレコードに対し、更新でない、新規データのつもりのデータがなぜ起こるのか。 初めからこの処理の情況を捉えて(データ作成側で、誤りが起こりえるのか)、 既に在るテーブルの 主キーにない場合は新規レコード追加、 ある場合は、エラーにするのか、更新レコードとして、属性的データを更新処理するのか? インプットデータの発生状況を良く捉えて対処しないとダメでしょう。 直ぐrs.AddNew に取りかかってよいはずがない(質問者のコードはそういうコードではない?)。
- rivoisu
- ベストアンサー率36% (97/264)
rs.AddNew '新規レコードようの場所を用意する rs.Update ’DBに書込む という感じ だから if shori="新規" then rs.addnew end if rs!no = Text1.Text 'ナンバーをセット rs!Name = Text2.Text '名前をセット rs.Update ’DBに書込み とする。 通常は更新(上書き 修正)のときは 事前に読んでることが多いのでキーになる部分はセットしなくても済む場合がおおいと思いますが。
うむむ。 既に、同じキーをもつデータがあるのに、同じデータを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は必要ですね。 がんばってください。
補足
回答ありがとうございます。 >ここは、元データを更新すべく、Commandオブジェクトで、UPDATE文を >発行するか。 >元データをいったん削除すべく、Commandオブジェクトで、DELETE文を >発行したあとで、追加を実行しましょう。 rs.Update '更新(保存) rs!no = Text1.Text 'ナンバーをセット rs!Name = Text2.Text '名前をセット ここで更新処理をしているのだと思っていましたが、違うんですよね? UPDATE文とは、addnewの前に記入するのでしょうか? また、どのように記述すればよいのでしょうか? だいぶ煮詰まってきましたので、 参考となるようなサイトがあれば、教えていただければ幸いです。 なにとぞよろしくお願いいたします。