DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データの追加について

環境/言語:[win2000、VB.NET]
分類:[.NET]

いつもお世話になります。
データベースへのデータの追加(VB.NET2003、postgreSQL)で
行き詰っています。
いろいろ調べたのですが、うまく使えません。
ADODBでうまくデータの参照はできたので、
このままADODBを使用したいと思っています。
デバックしたところ cm.Execute(sql)でエラーが出ているようで
エラーは"オブジェクト参照がオブジェクト インスタンスに設定されていません。"
と出ます。参照設定が足りないのか、どうにも困っています。
右も左も分らないところから始めたので、勘違いしている部分や
説明不足な所もあると思いますが、よろしくお願いいたします。

いかにソース記述します。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim ct As New ADODB.Connection
Dim cm As ADODB.Command
Dim msg As Integer
Dim sql As String
Dim rs As New ADODB.Recordset

Try
With ct
.ConnectionString = "dsn=xxx;"
.Open()
.CursorLocation = 2
End With
sql = "INSERT INTO member (ID,year) values ('" & ID.Text & "','" & year.Text & "')"
cm.Execute(sql)

MsgBox("登録しました。", MsgBoxStyle.OKOnly)
Catch ex As Exception
Trace.Flush()
MsgBox(ex.Message)

End Try

End Sub
> ADODBでうまくデータの参照はできたので、
> このままADODBを使用したいと思っています。

ならば、『ReleaseComObject()』の呼び出しを忘れないようにしないと。

> デバックしたところ cm.Execute(sql)でエラーが出ているようで
> エラーは"オブジェクト参照がオブジェクト インスタンスに設定されていません。"
変数 cm が空っぽ(Nothing)なので、そのようなエラーになっているのでしょう。
あらかじめ、Newでインスタンスを生成しておいてください。
2005/07/12(Tue) 15:08:15 編集(投稿者)

こんにちは、じゃんぬ です。

■No11739に返信(ももさんの記事)
> ADODBでうまくデータの参照はできたので、このままADODBを使用したいと思っています。

いいえ、ADO.NET を使いましょう。

> デバックしたところ cm.Execute(sql)でエラーが出ているようで
> エラーは"オブジェクト参照がオブジェクト インスタンスに設定されていません。"と出ます。

そのまんまです。
Command のインスタンスが生成されていません。


# 弁さんと被ってしまいましたか... orz
■No11740に返信(魔界の仮面弁士さんの記事)
> ならば、『ReleaseComObject()』の呼び出しを忘れないようにしないと。
調べてみたのですが、どのように書けば良いのか分りません・・・・(ノД`)
ReleaseComObject() = Marshal.ReleaseComObject()ですか?
検索したところMarshal.ReleaseComObject()が出てきます。。
質問してばかりですいません。


Dim ct As New ADODB.Connection
Dim cm As ADODB.Command
Dim msg As Integer
Dim sql As String
Dim rs As New ADODB.Recordset

Try
With ct
.ConnectionString = "dsn=xxx;"
.Open()
.CursorLocation = 3
End With

cm = New ADODB.Command☆

sql = "INSERT INTO aaa (ID,year) values ('" & ID.Text & "','" & year.Text & "')"
cm.Execute(sql)
MsgBox("登録しました。", MsgBoxStyle.OKOnly)


Catch ex As Exception
Trace.Flush()
MsgBox(ex.Message)

End Try
End Sub

☆の部分追加しました。
エラーが「"この操作を実行するために接続を使用できません。このコンテキストで閉じているかあるいは無効です」に変わりました。

本当聞いてばかりで申し訳ありません。
よろしくお願いいたします。


> いいえ、ADO.NET を使いましょう。

ADO.NETの方が良いのでしょうか?
詳しくどこが違うのか分っていないので、
ADO.NETの良い所を教えてください。
とりあえずADO.Netなどといっていますが、.NET Frameworkの標準の方式です。
本の一冊でも読んでお勉強してみるほうが近道だと思います。

がんばってくださいね。(^^
■No11747に返信(中博俊さんの記事)
> とりあえずADO.Netなどといっていますが、.NET Frameworkの標準の方式です。
> 本の一冊でも読んでお勉強してみるほうが近道だと思います。
>
> がんばってくださいね。(^^

本当それは、痛感しています。
ただ、急ぎの仕事でどうしてもVBをやることになり
自分の力だけでは前に進めない状態です。
初歩的な質問ばかりで本当申し訳ないと思っています。
また、よろしけれご教授ください。
■No11748に返信(ももさんの記事)
>ただ、急ぎの仕事でどうしてもVBをやることになり
>自分の力だけでは前に進めない状態です。
それはちゃんとお金を払って外注さんでも雇わないとこなせない仕事で
あって、質問掲示板で解決できる問題ではないですね。ちゃんと上司と
相談して下さい。
そもそも情報がお金になる事は知ってますよね?ここでコメントを
書く時間も仕事に費やせばお金にすることができる事は理解できますか?。
ここでの回答者の多くはそんなお金でご飯食べてたりするわけですよw。
いくらなんでもタダで要求しすぎじゃないですか?。どれだけタダ
で働かせれば気が済みますか?社会人として節度ある要求をお願い
します。

>ADO.NETの方が良いのでしょうか?
>詳しくどこが違うのか分っていないので、
>ADO.NETの良い所を教えてください。
回答が3行で終わるようなものではありません。中博俊さんのおっしゃる
通り、本を読む方が早いんです。根本的な概念から違いますから。
ADO.NETの良い所というか、名前の通り、ADO.NETは[.NET]専用に開発された
.NET Frameworkクラス・ライブラリに含まれる一連のクラスの集まりです。
良い悪いではなくて使って下さい。ガン○ムでも"専用"は3倍速いでしょ?(意味不明)
[@IT ADO.NET基礎講座]
http://www.atmarkit.co.jp/fdotnet/basics/adonet_index/index.html

>> ならば、『ReleaseComObject()』の呼び出しを忘れないようにしないと。
>調べてみたのですが、どのように書けば良いのか分りません・・・・(ノД`)
ReleaseComObject の問題はちょっと分野が違います。参照の追加で[COM]
というタブを選択して追加したと思いますが、ここで追加したコンポーネントは
使用したオブジェクトごとに ReleaseComObject が必要だと言われています。
(まだマイクロソフトの正式な記事は無い(?))一番分かり易いのがよく使われて
いるエクセルに対するもので、以下のサイトで大変よく纏められておりますので
読んでください。
[VBレスキュー(花ちゃん) VB.NET .NET Tips - Excelのプロセスが正常に終了しない理由]
http://www.bcap.co.jp/hanafusa/dotnet/Excel08.htm

一番下に魔界の仮面弁士さんの書き込みが並んでますが、このような対処を
してCOMオブジェクトの解放忘れなしにプログラムを組まねばなりません。
ちゃんと省略せずに全てのCOMオブジェクトを管理できるなら誰も注意しません。
ちゃんと開放して下さい。
>>> ならば、『ReleaseComObject()』の呼び出しを忘れないようにしないと。
>>調べてみたのですが、どのように書けば良いのか分りません・・・・(ノД`)

下記に、ADOのオブジェクトを ReleaseComObject しているサンプルがあります。
VBではなく、C♯ですけれどね。
http://support.microsoft.com/kb/321415/ja

このサンプルでは、Connectionしか解放していませんが、実際の運用では、
Recordset/Fields/Fieldなどのオブジェクトも、「使用後」には
ReleaseComObject が必要である事に注意してください。

ReleaseComObjectを忘れた場合、Excelならば「プロセスが残る」ので、
解放忘れを確認できますが、ADOの場合は、解放忘れに気付きにくいので、
デバッグの手間は増えてしまうと思います。


> してCOMオブジェクトの解放忘れなしに
(中略)
> ちゃんと開放して下さい。
個人的には、開放→Open、解放→Releaseというイメージが……。(^-^;
# 本題とは関係ないので、どうでも良い事ですが。
本当に皆様ありがとうございます。
おっしゃるとおり、私が甘すぎることは重々承知しております。

教えていただいた事を参考にし、また初めから勉強します。
とても参考になりました。
こんな私に詳しく教えていただいて本当にありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板