VB6からSQLServer7に加工したデータを正常に追加できないのはなぜ?

このQ&Aのポイント
  • VB6からSQLServerに対して加工したデータを追加するプログラムをしていますが、最後に実行したInsert文しか正常に実行終了しておらず、何かおかしいところがあるのか教えてください。
  • VB6からSQLServer7にデータを追加するプログラムを実行していますが、最後のループ処理でInsertされたデータしか追加されていません。何が問題なのでしょうか?
  • VB6からSQLServer7に加工したデータを追加するプログラムを作成しましたが、最後のループ処理でInsertされたデータしか追加されていないことが分かりました。問題があるかどうか教えてください。
回答を見る
  • ベストアンサー

VB6からSQLServer7に加工したデータを、正常に追加できません。なぜ?

VB6から、SQLServerに対して 加工したデータを追加するプログラムをしています。 (環境:Windows2000 Pro + VB6[SP5] + SQLServer[7.0]) 一度、「sampletable」のデータを全件削除した上で、 必ず2回以上実行するループ処理の中で、Insert文を発行しています。 がしかし、プログラム実行後にSQLServerのデータベースを検索してみると、 何故か、最後に実行したInsert文しか、正常に実行終了していないようなのです。 (最後のループ処理でInsertされたデータしか、追加されてないのです。) 何か、プログラム上で、おかしいところとか 抜けているところとかございましたら、教えて下さい。 <サンプルプログラム> ' SQL Server へ接続 Set cn = New ADODB.Connection cn.Open "Provider=SQLOLEDB;" & _ "Data Source=(localhost);" & _ "Initial Catalog=database", "login", "passwd" ' 一度、テーブルデータを削除する strSQL = "delete from sampletable" Set rs = cn.Execute(strSQL) Do 'このループ処理は、2回以上、必ず動作します。 ・・・ (データ加工処理) ・・・ ' データを追加する strSQL = "INSERT INTO sampletable(xxx, xxx, xxx) " & _ "VALUES('" + HENSUU-A + "','" + HENSUU-B + "','" + HENSUU-C + "')" Set rs = cn.Execute(strSQL) Loop ' SQL Server 接続を閉じる cn.Close

noname#2802
noname#2802

質問者が選んだベストアンサー

  • ベストアンサー
  • yoshioz
  • ベストアンサー率28% (10/35)
回答No.1

同じようにやってみたらうまくいきました。 ので、予想ですが 「HENSUU-A」というのは数値ですか? 数値なら 「HENSUU-A + "','"」ここでエラーになってしまいそうな気がします。 文字列の結合には「&」がおすすめです。

noname#2802
質問者

お礼

あーっ! そうです。数値型でした(*^.^*) いやぁ、お恥ずかしい限りです。 (いつも、SQL書くときって、シングルコーテを書くのがクセになってました・・・) 明日、試してみます。ありがとうございました。 と・こ・ろ・で、 エラーが発生したかどうかをチェックする方法って、どうすれば良いのでしょう? そもそも、そういうロジックを入れておけば、原因がわかったのかも知れないのですが、 いかんせん、VBでDB処理するの初めてなもんで・・・。 もし良かったら、教えてくださいませ。

その他の回答 (1)

  • yoshioz
  • ベストアンサー率28% (10/35)
回答No.2

>(いつも、SQL書くときって、シングルコーテを書くのがクセになってました・・・) っていうか数値型と文字列を「+」で結合したら 型が一致しないってエラーになりそうな気がしたんですが・・・? > エラーが発生したかどうかをチェックする方法って、どうすれば良いのでしょう? エラーが発生しそうな場所より前に -------------- Sub Proc1() On Error Goto ErrProc 'エラーが発生しそうな処理 Exit Sub ErrProc: MsgBox "エラーが発生しました。" End Sub -------------- のように「On Error GoTo ErrProc」と 書いておけばエラーが発生したときにErrProcに飛んでくれます。

noname#2802
質問者

お礼

無事に解決いたしました。 何から何まで、わかり易く親切に教えて頂いてありがとうございました。

関連するQ&A

  • Insert時に一意制約エラーがでる。

    よろしくお願いします。 VB6.0 DB:ORACLE8.1.6 クライアントWIN2000 サーバーWIN2000SERVER VBでデータをINSERTするプログラムを作ったのですが、どうしても一意制約エラーが出てしまいます。 これはデータの都合上仕方が無いのか? (データの主キーに「.」が入っているのでエラーになるのでしょうか?) プログラムが悪いのか? よろしくお願いします。 エラーは2回目の実行部分です。 データ(すべて文字型) 000   001   002 ベルリン12345 ベルリン 12345 ベルリン123.45 ベルリン 123.45 ベルリン123 45 ベルリン 123 45 プログラム strSql = "Insert Into KUNIBETU(k000,k001,k002) Values ('ベルリン12345','ベルリン,'12345')" '処理のチェック If Execute_sql(strSql) = False Then Err.Raise -1, , "失敗しました!" cn.RollbackTrans rs.Close Set rs = Nothing cn.Close Set cn = Nothing Exit Sub End If strSql = "Insert Into KUNIBETU(k000,k001,k002) Values ('ベルリン1234.5','ベルリン','123.45')" '処理のチェック If Execute_sql(strSql) = False Then Public Function Execute_sql(strSql As String) As Boolean Dim cmd As New ADODB.Command Execute_sql = False ' Commandオブジェクトを作成 Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandText = strSql ' アクション クエリーを実行 cmd.Execute      ←←←←←←エラー部分 Set cmd = Nothing Execute_sql = True Exit Function

  • MSFlexGridでデータの追加の方法は?

    VB6.0 WINXP DB:Oracle10g  よろしくお願いします。 SELECT文でデータベースからデータを取ってきてMSFlexGridにデータを送ったのですが、そのデータに更に追加したいと思います。 ' ADOのオブジェクト変数を宣言する Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim STRSQL As String 'Oracleとの接続 cn.Open "Provider=MSDAORA;" & _ "Data Source=NT;", "scott", "tiger" ' SQLステートメントを指定してレコードセットを作成する re.Open STRSQL = "select * from TOKUI WHERE A01 = 100" rs.CursorLocation = adUseClient rs.Open STRSQL, cn, adOpenDynamic, adLockBatchOptimistic 'グリッドに送る Set MSFlexGrid1.DataSource = rs 'ここからのSELECT文を追加したいと思います。 STRSQL = "SELECT TOKUI FROM WHERE A01 = 200" Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open STRSQL, cn, adOpenDynamic, adLockBatchOptimistic よろしくお願いします。

  • VB2005でAddNew()

    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

  • DBから取得したオブジェクトの受け渡し方法

    はじめましてVB初心者でわけが分からなくなっています。DBをクローズした後に取得したレコードセットを他の関数に渡すにはどうしたらよいでしょうか?おそらく、そんなのcloseせずにやればいいと思うかもしれませんが、可能かどうかがわかりません。どうか教えてくださいよろしくお願い致します。 下記のコードにて行ってます。Set rs = cn.Execute(strSQL)で取得しています。rsをDBを閉じた後も他の関数に渡せるようにしたい訳です。m(..)m Dim cn As Object Dim rs As Object Private Sub getData() Dim strSQL As String Set cn = CreateObject("ADODB.Connection") cn.Open "省略" strSQL = "SELECT * FROM swan" Set rs = cn.Execute(strSQL) Set rs = nothing Set cn.close Set cn = nothing End Sub

  • ExcelVBA Accessにデータ書き込み

    VBAでコマンドボタンを押した際に特定のセルの値をAccessDBに入力するプログラムを作りたいのですが、上手くいきません...。 実行した際に「実行時エラー '21472179000 (80040e 14)': オートメーションエラーです。」と表示されます。 また、ステップインで実行してみるとEnd Withのところでエラーが発生します。 恐らくインサート文が間違っていると思うのですが、試行錯誤しても解決できませんでしたので教えて頂きたいです。 以下プログラムです。 Private Sub CommandButton1_Click() Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim strSQL1 As String Dim a As String a = Range("A1").Value Dim b As String b = Range("A2").Value Dim c As String c = Range("A3").Value constr = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=~.accdb strSQL1 = "insert into " & _ "TableName (1,2,3) " & _ "values ('" + Range("A1").Value + "','" + Range("A2").Value + "','" + Range("A3").Value + "')" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command With cmd .ActiveConnection = cn .CommandText = strSQL1 .Execute End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub 以上、宜しくお願い致します。

  • VB6でのSQLでのアクセスデーターの追加について

    abc = "insert into 社員テーブル(コード,名前) values ('0002','Takeda')" c1.Execute abc 上記のようにプログラムで直接データーを入力すると データーは追加で登録できるのですが 下記のように、テキストボックス1(tx1.Text)とテキストボックス2(tx2.Text)にデーターを入力して、入力した 内容を追加しようとするとエラーになります。 どこが間違っているのでしょうか? abc = "insert into 社員テーブル(コード,名前) values (tx1.Text,tx2.Text)" c1.Execute abc

  • オブジェクトが開いている場合は、操作は許可されませ

    エクセルvbaです。 ADOを使ってループしているのですが 前回のループで rs.Close: Set rs = Nothing をしなかったために rs.Open strSQL, cn, adOpenStatic, adLockOptimistic で 「オブジェクトが開いている場合は、操作は許可されません」 となるので、 イミディエイトウインドウで rs.Close: Set rs = Nothing としてるのに、 実行時エラー 3219 このコンテキストで操作は許可されていません。 となります。 rs.Closeだけでも同じエラーです。 この状態で、vbaを中断せずに rs.Open strSQL, cn, adOpenStatic, adLockOptimistic を通過させるにはどうすればいいですか?

  • VB6.0+MyODBC5.0+MySQL4.1にてインサートデータが0になる

    VB初心者です。 上記の条件でVB上からDBへインサート文を実行させたのですがMyadminを開いてデータを確認するとデータがすべて0になってしまいます。 因みにインサート文に直接データを代入するとちゃんとDBに登録されます。 OS:WinXP Dim a AS Integer Dim b AS Integer Dim c AS Integer Private Sub form_load() Set cn = CreateObject("ADODB.Connection") cn.Open "dsn=MySQL;uid=root;Pwd=" cn.CursorLocation = 3 a = 1 b = 2 c = 3 cn.BeginTrans cn.Execute "insert into test values (a, b, c)" cn.CommitTrans cn.Close インサートを変数指定ではなく直接(1, 2, 3)と入れると登録できます。 単純な勘違いを犯しているだけだと思うのですが、どちら様かお知恵を拝借できませんでしょうか? よろしくお願いいたします。

  • ACCESS 処理の件数を取得したい

    どうやっていいのか困っています。 DAOで処理をしています。 下記のような処理があり、それぞれの更新、検索、追加の件数を とりたいのですがどなたか教えていただけないでしょうか? もしくはサンプル、どこかいいサイトはありませんか? よろしくおねがいします。 UPDATEの場合 CurrentDb.Execute "UPDATE T_A SET WHERE Flag = '0'", dbFailOnError SELECTの場合 strSQL = "SELECT * FROM T_N " CurrentDb.Execute strSQL, dbFailOnError INSERTの場合 strSQL = "INSERT INTO FROM T_Y " CurrentDb.Execute strSQL, dbFailOnError

  • Accessでのデータベースの使用(VBA)

    Private Sub 実行_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim StSQL As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset strSQL = "INSERT INTO マスタ(コード) VALUES(コード) ;" rs.Open strSQL, cn, , adLockOptimistic '//前のコード(エラーになりました。) ' rs.Close 'cn.Close 'Set rs = Nothing 'Set cn = Nothing Set rs = Nothing: Close Set cn = Nothing: Close Accessを使用したvbaのコードの書き方について教えてほしいです。毎度Access の質問ばかりしてすみません。以下のコードはADOを使用してマスタというテーブルを読み込んで最後にrs.CloseでRecordSetを開放しようとしたのですが「オブジェクトが閉じている場合は、操作は許可されません。」というエラーメッセージが出てしまい原因がわかりませんでした。Openしていて開いているはずなのにエラーが出てしまい、 Set rs = Nothing: Closeに変えたら治りました。何故rs.Closeではエラーが出てしまったのでしょうか。 もう一つお聞きしたいです。 strSQL = "INSERT INTO マスタ(コード) VALUES(コード) ;"でコードという名前を付けたテキストボックスの値をマスタテーブルのコードの列に追加したいのですがテキストボックスの値の取り方が分かりません。(コード.Value)とやってみてもだめでした。どうやったらSQL文でテキストボックスの値をテーブルに追加できるんでしょうか。

専門家に質問してみよう