- PR -

VB2005でAddNew()

1
投稿者投稿内容
K
会議室デビュー日: 2007/11/06
投稿数: 5
投稿日時: 2008-07-24 20:16
VB2005Express、SQLServer2005にて開発を行っています。

テーブルに対してSELECTを行った結果、該当レコードがなかったらAddNewでレコードを追加しようと実行すると
「現在のRecordsetは更新をサポートしていません。プロバイダか選択されたロックタイプの限界の可能性があります。」
というエラーが発生します。
レコードセットのパラメータを色々変えてみたのですが状況が変わりません。どなたか原因がお分かりの方いらっしゃいましたら教えて下さい。

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
strCn = "Provider=WWW;Password=XXX;User ID=YYY;Data Source=ZZZ;Persist Security Info=True"

cn.Open(strCn)
cn.BeginTrans()

Try
strSQL = "SELECT * FROM テーブル1"
  rs.Open(strSQL, cnGSTAFF, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic)
If rs.EOF Then
'登録
rs.AddNew()
rs.Fields("コード").Value = 10000
rs.Fields("内容").Value = "OK"
Else
'更新処理
End If

rs.Update()
rs.Close()
cn.CommitTrans()
cn.Close()
Catch ex As Exception
rs.Close()
cn.RollbackTrans()
End Try
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-07-24 20:32
Recordset を Open して編集するならば SQL ステートメントではなくテーブル名 + adOpenTable を使うべきですよ。

それにしても .NET 2.0 なのに COM の ADODB ですか... ADO.NET テクノロジを使うべきだと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2008-07-24 21:27
さかもとと申します。

私もじゃんぬねっと様同様の疑問を持ちました。

ADODBを使用せざるを得ない仕様なのでしょうか?

Accessからの移行システム(単にMDB→SQL Serverに)ということであれば、最初は色々と面倒かもしれませんが、思い切ってADO.NETへ切り替える方が今後の保守性などを考慮したときに有益かもしれません。


_________________
------------------------------------------
拝啓、さかもとと申します♪
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2008-08-20 10:32
クロスポストにつき、情報共有の為
リンクしておきます。
http://okwave.jp/qa4198801.html

引用:

Kさんの書き込み (2008-07-24 20:16) より:
VB2005Express、SQLServer2005にて開発を行っています。

テーブルに対してSELECTを行った結果、該当レコードがなかったらAddNewでレコードを追加しようと実行すると
「現在のRecordsetは更新をサポートしていません。プロバイダか選択されたロックタイプの限界の可能性があります。」
というエラーが発生します。
レコードセットのパラメータを色々変えてみたのですが状況が変わりません。どなたか原因がお分かりの方いらっしゃいましたら教えて下さい。

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
strCn = "Provider=WWW;Password=XXX;User ID=YYY;Data Source=ZZZ;Persist Security Info=True"

cn.Open(strCn)
cn.BeginTrans()

Try
strSQL = "SELECT * FROM テーブル1"
  rs.Open(strSQL, cnGSTAFF, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockOptimistic)
If rs.EOF Then
'登録
rs.AddNew()
rs.Fields("コード").Value = 10000
rs.Fields("内容").Value = "OK"
Else
'更新処理
End If

rs.Update()
rs.Close()
cn.CommitTrans()
cn.Close()
Catch ex As Exception
rs.Close()
cn.RollbackTrans()
End Try

1

スキルアップ/キャリアアップ(JOB@IT)