こんにちは。私はVB6、WIN2000を使っています。
データグリッドの中にあるデータをDeleteキーを使って削除したいのですが。
Allow DeleteプロパティをTRUEにしても、Deleteキーを押すと
「更新に必要なキー列の情報がありません。」というエラーが出てしまいます。
どのように対処したらいいでしょうか?よろしくお願いします。
抽出されたデータに、主キー列は含まれていますか?
魔界の仮面弁士様、返信ありがとうございます。
>抽出されたデータに、主キー列は含まれていますか?
はい、一応テーブルの主キーは含まれています。Visibleプロパティで隠してはいるのですが。。データグリッドのプロパティに主キーを指定するような項目でもあるのでしょうか?
それと、データグリッドの商品番号という列に商品コードを入力するとデータグリッドの商品名列と商品単価列を表示するようにしてあげたく、参考書を見て、自分なりに作ってみたのですが。入力しても表示されません。一度閉じてもう一度開くと表示されているのですが・・・。(これと削除されないのも関係するのでしょうか?)下記がそのコードです。
Dim RS As New ADODB.Recordset
Dim strSQL As String
strSQL = "SELECT M2_ID, M2_DENPYO_NO AS 伝票番号, " _
& "M2_SYOHIN_CD AS 商品番号 , " _
& "M1_SYOHIN_NM AS 商品名 , " _
& "M1_TAN AS 商品単位 ,M2_SU AS 数量 " _
& "FROM M2_SUB_TBL INNER JOIN M1_SYOHIN_TBL " _
& "ON M2_SYOHIN_CD = M1_SYOHIN_CD " _
& "WHERE M2_SYOHIN_CD = '" & Me.Syohin_No.Text & "'"
RS.CursorLocation = adUseClient
RS.Open strSQL, CN, adOpenStatic, adLockOptimistic
Set Me.DataGrid.DataSource = RS
おはようございます。
一つお聞きしたいことがあるのですが。
返事をもらえないと言うのは質問の仕方が悪いのでしょうか?
それとも説明が足りないのでしょうか?
よろしくお願いします。
環境は WINXP ACCESS 2003SP2 VB6.0
こんにちは、随分前の質問ですが自分もこの質問と同じ状態です。
主キーも設定してありますしプロパティもAllowAddNew=False
AllowDelete=True,AllowUpdate=Trueです。
ちなみに自分はadodcでもやってみましたし、ADODBでもやってみました
どちらも同じエラー(更新に必要なキー列の情報がありません)と
出てしまい削除できません。
直接ACCESSからテーブルを開いて削除することは出来ます。
説明不足もあるかもしれませんが、その時はご指摘下さい。
なんとかご教授いただけないでしょうか?
よろしくお願いします。
協力するのは吝かでないので、
読み手側で、現象を再現できるような情報があれば、解決できるかもしれません。
とりあえず、
どんな環境(開発環境のOS、VB6のサービスパックの適用状況)で、
どんなテーブルで
どんなSQLで
どんなコードを書いてて(特にCursorLocation、CursorType、LockTypeなど)、
等がわからないと
「うちじゃぁ問題なく消せるよ」としかいえないですけど。
主キー項目は表示しているのですよね?
もげ様、早速のレスありがとうございます。
>読み手側で、現象を再現できるような情報があれば、解決できるかもしれません。
はい、確かにそうですよね。再現できないとどうしようもないですね。
>どんな環境(開発環境のOS、VB6のサービスパックの適用状況)で、
OSはWINXP SP2 VB6.0SP2 です。
>どんなテーブルで
テーブル名はTBL配信予約リスト
テーブルは主キーに設定してあるのが配信日時で
件名、本文、添付ファイル、配信先
この5つで構成されています。
全てメモ型です。
>どんなSQLで
SQL = "SELECT * FROM TBL配信予約リスト"
>どんなコードを書いてて(特にCursorLocation、CursorType、LockTypeなど)、
こういったコードを書いています。
Private Sub Form_Load()
frm配信予約リスト.Refresh
Dim Con As ADODB.Connection
Dim path As String
path = App.path
If Right(path, 1) <> "\" Then path = path & "\"
path = path & "db1.mdb"
Set Con = New ADODB.Connection
Con.Provider = "MSDataShape"
Con.Properties("Data Provider").Value = "Microsoft.Jet.OLEDB.4.0"
Con.Open path
Dim SQL As String
SQL = "SELECT * FROM TBL配信予約リスト"
Set rs = New ADODB.Recordset
rs.Open SQL, Con, adOpenDynamic, adLockPessimistic
rs.StayInSync = True
Set DataGrid1.DataSource = rs
Set rs = Nothing
Set Con = Nothing
End Sub
フォームのDataGrid1にはちゃんと5つの項目が表示されるのですが、
Deleteを押して一旦は消えるのですが、ACCESSのDB自体も更新されていません。
またフォームをloadしても削除したはずのデータが表示されている状況です。
メインのフォームの方でもdatagridを使っているのですが、そちらは
普通にDeleteを押すと削除されています・・・
プロパティは同じにしてあるのですがサブフォームのDataGrid1だけ
DBに反映されないといった次第です。
なんとかよろしくお願いします。
とりあえず試してみた結果、
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
のようにクライアントカーソルを使用すると削除できます。
>Con.Provider = "MSDataShape"
なぜ、ここでMSDataShapeプロバイダが要るのかよくわかりません。
ネイティブなMicrosoft.Jet.OLEDB.4.0プロバイダで
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open Path
でもいいかも。
あと、
CursorLocation
CursorType
LockType
の組み合わせに関して調べて試してみてください。
もげ様ご指導ありがとうございます。
CursorLocation
CursorType
LockType
調べて、色々勉強になりました。
しかし、その組み合わせを色々やってみましたが、同じ結果で
Deleteボタンで削除する事が出来ませんでした。
もう打つ手が無いと諦めかけて、ACCESSの方に原因があるのでは?
と同僚に指摘され
ACCESSのテーブルのデザインを見直してみました。
原因はなんと、ACCESSのテーブルのデザインにあったのです・・・
全てメモ型のままではダメで一つだけテキスト型にしたら
あっさりと削除できました。
しかし今回の事で色々と勉強できました。
もげ様、他の読んでくださったみなさまありがとうございました。
もう一つ言わせていただくと。
送信日時を主キーにしてしてしまうと、同じ日時の値が入れられない
ので、全てメモ型にしてオートナンバー型のデータを追加しただけでも
うまくいきました。
他の同じ経験をなさった方にちょっとでも参考になれば幸いです。
萌え
ツイート | ![]() |