[リストへもどる]
一括表示

投稿時間:2002/11/02(Sat) 10:21
投稿者名:とも
Eメール:
URL :
タイトル:
ADOをコードした場合のUpdateDelete
今、ADOをコードで設定してプログラムを作成しているのですが、どうしても、UpdateとDeleteをしようとすると、「キーフィールドがNull」というエラーがでます。コードも何度もチェックしましたし、データベース(アクセス2000)のほうもフィールドをチェックしたりしましたが、問題はないのです。一体何が原因で、どのようになおせばいいのでしょうか?

まずフォームロードイベントで以下のように設定(テキストボックス以外にコンボボックスにデータをロードしてます)

Dim strSQL As String

Set conVideo = New ADODB.Connection
Set rsVideo = New ADODB.Recordset

strSQL = "SELECT Studio.[Studio Name], Video.[Movie Number]," & _
          "Video.Title, Video.Category, Video.Length " & _
          "FROM Studio INNER JOIN Video ON Studio.[Studio ID] = Video.[Studio ID]"

With conVideo
     .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Persist Security Info=False;Data Source = " & App.Path & _
               "VBVideo2000.mdb;Mode = readwrite"
    
    .Open
End With
With rsVideo
      .CursorLocation = adUseClient
      .Open strSQL, conVideo, adOpenDynamic, adLockOptimistic, adCmdText
End With

Call AssignData
With rsVideo
  Do Until .EOF
   If ![Movie Number] <> "" Then
    cboNum.AddItem ![Movie Number]
    cboTitle.AddItem !Title
    cboStudio.AddItem ![Studio Name]
    cboCategory.AddItem !Category
   End If
   .MoveNext
Loop
.MoveFirst
End With

そしてAddコマンドボタンで
rsVideo.AddNew

として、Saveコマンドボタンで
rsVideo.Update

としています。Deleteも同様です。
考えられる、原因はなんでしょうか?

投稿時間:2002/11/02(Sat) 10:49
投稿者名:A221
Eメール:
URL :
タイトル:
Re: ADOをコードした場合のUpdateDelete
>どうしても、UpdateとDeleteをしようとすると、「キーフィールドがNull」

主キーを設定しているフィールドに値を入れていないというエラーですね。

>  strSQL = "SELECT Studio.[Studio Name], Video.[Movie Number]," & _
>           "Video.Title, Video.Category, Video.Length " & _
>           "FROM Studio INNER JOIN Video ON Studio.[Studio ID] = Video.[Studio ID]"

このSQLから推測するに、
Studio.[Studio ID] と Video.[Studio ID]がそれぞれのテーブルの主キーだと
思いますが、それぞれに値を入れてないのでは?(このIDがオートナンバーなら違うのですが)

Rs.AddnewとRs.Updateを使用するのであれば元テーブルから引っ張ってきて
おかないといけませんね。

投稿時間:2002/11/03(Sun) 06:26
投稿者名:とも
Eメール:
URL :
タイトル:
Re^2: ADOをコードした場合のUpdateDelete
くわしく説明していなくて申し訳ないです。
StudioのほうはStudioIDがキーですが、
VideoのほうはMovie Numberがキーで、
フォーム上にUnboundのテキストボックスを
Movie Numberのためにおいていて、そこに番号をうっているのですが、
BreakしてチェックするとrsVideo![Movie Number]にそのバリューが入りません。
他のフィールドにはきちんとバリューがはいっているのに、このMoview Numberにだけ
はいらないんです。スペルに間違いがないかどうかもチェックしましたが、すべてただし
かったです。他に考えられる原因というと何が思い当たりますか?

投稿時間:2002/11/05(Tue) 08:02
投稿者名:hoge
Eメール:
URL :
タイトル:
Re^3: ADOをコードした場合のUpdateDelete
http://www2j.biglobe.ne.jp/~little-g/cgi-bin/vbdatabase.cgi
の#3359

解決したら、
http://www7.big.or.jp/~pinball/discus/vb/42970.html
もちゃんとフォローしてね。

投稿時間:2002/11/05(Tue) 11:41
投稿者名:A221
Eメール:
URL :
タイトル:
Re^3: ADOをコードした場合のUpdateDelete
> フォーム上にUnboundのテキストボックスを

Visible=Falseのテキストボックスのことですね?

> Movie Numberのためにおいていて、そこに番号をうっているのですが、
> BreakしてチェックするとrsVideo![Movie Number]にそのバリューが入りません。

Textbox.Textですね?

> 他のフィールドにはきちんとバリューがはいっているのに、このMoview Numberにだけ
> はいらないんです。スペルに間違いがないかどうかもチェックしましたが、すべてただし
> かったです。他に考えられる原因というと何が思い当たりますか?

Addボタン押下時のコードがなければなんともいえません。
またフィールドがオートナンバーのときは入らなかったような。(未確認)

投稿時間:2002/11/06(Wed) 04:14
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: ADOをコードした場合のUpdateDelete
# 元質問からは脱線します。

>> フォーム上にUnboundのテキストボックスを
> Visible=Falseのテキストボックスのことですね?

データコントロール等と連結させてデータを取得する事を、
データバインドする、もしくはバウンドモードで使う、などと呼びます。

それに対して、VBでUnboundといった場合、データソースと直接連結させる事無く、
データの表示・取得を行うことを指す事が多いようです。>A221さん
この場合、「データソースとは連結させずに利用する」という意味で用いられる場合と、
「データソースと間接的に連結させて利用する」という意味で用いられる場合があります。

# もっとも、ともさんが書かれたUnboundという言葉が、どのような意味で
# 使われているのかは、私にはわかりませんが。。。


> またフィールドがオートナンバーのときは入らなかったような。(未確認)

入らないわけではありませんが、ちょっとしたコツが必要だったりします。

ADOのadUseClientモードの場合は、AddNewしただけでは、オートナンバー値は採番されません。
実際の更新処理は Updateメソッド発行時に行われるので、オートナンバー値が得られるのも、
Update後という事になるからです。さらに、Updateしただけではデータベースの更新情報が
得られないため、Resynch なり Requery なりを使って、更新後の値をDBから
取得しなおす必要があります。こうした手順を踏めば、採番された値を得る事ができます。
(なお、adUseServerの場合は、更新のタイミングが異なるため、事情が変わってきます。)


==== 以下蛇足 ====

ところで、ともさんはV友のDB掲示板#3340でも、同じような質問をされていますよね。
この掲示板では、「掲示板利用上の注意事項」の欄に、
》 VB初心者友の会等他サイトに投稿され、さらに、こちらにも
》 投稿されるような事(マルチポスト)は、マナー違反です。
と明記されています。あまり色々な場所で質問をするのは、やめた方がよいかと思いますよ。

ただし、既に投稿してしまった分に関しては、その全てに責任をもって、結果報告をして下さいね。

その際、できれば、
  http://koz.homeip.net/bbs/show.asp?bodyid=1902
》 ご意見を参考にさせてもらって、やりなおしたら、
》 エラーがでなくなりました。

http://www7.big.or.jp/~pinball/discus/vb/42970.html
》 いろいろ試してみて、なんとか解決しました。

などという書き方ではなく、もっと具体的な報告をしていただけるとありがたいです。

結果報告として、「〜〜〜というコードに修正したら解決できました」などといった、
より具体的な解決策が書かれていれば、同じよう悩みを持った第3者が読んだ時に、
問題解決の手助けとする事ができますので。。。

投稿時間:2002/11/06(Wed) 08:44
投稿者名:A221
Eメール:
URL :
タイトル:
Re^5: ADOをコードした場合のUpdateDelete
> # 元質問からは脱線します。
>
> >> フォーム上にUnboundのテキストボックスを
> > Visible=Falseのテキストボックスのことですね?
>
> データコントロール等と連結させてデータを取得する事を、
> データバインドする、もしくはバウンドモードで使う、などと呼びます。
>
> それに対して、VBでUnboundといった場合、データソースと直接連結させる事無く、
> データの表示・取得を行うことを指す事が多いようです。>A221さん
> この場合、「データソースとは連結させずに利用する」という意味で用いられる場合と、
> 「データソースと間接的に連結させて利用する」という意味で用いられる場合があります。

なるほど。バウンドとはそういうことなのですね。理解しました。
ありがとうございます。>魔界の仮面弁士さん

#本題に関係ありませんが、いつぞや魔界の仮面弁士さんのお作りになっていた
#(と記憶しています)休日を求めるモジュール、ありがたく活用させていただいています。
#この場を借りてお礼申し上げます。(mOm)