グリッドからのデータを読みこんでmdbに保存

解決


みそ  2005-12-02 18:10:46  No: 128503

使用環境  WinXP/VB6.0

すみません。以前「csvデータをmdbに保存するには?」という質問をしたみそです。
今回もやはりmdbに保存なのですが、csvファイルをそのまま保存、ではなくて一度データグリッドに表示したものをコマンドボタンを押すと保存できる、という形にしたいのです。

一応表示されたデータ(12行1771列のデータです)を読み込むFor文は完成したのですがここからどうSQL文を使ってmdbに保存するのかがよくわからないのです。

自分で作ったをのせます。
なにかいいアドバイス、添削がありましたらぜひともお願いします。
使っていない変数はこれから使うかなぁと思って設定したものです。
--------------------------------------------------------
Private Sub Command7_Click()

    Dim rstData     As Recordset
    Dim db As Database
    Dim strsql As String
    Dim strTextdata(11) As String
    Dim lngCnt As Integer
    
        For lngCnt = 1 To vsFlexGrid1.Rows - 1
                
            strTextdata(0) = vsFlexGrid1.TextMatrix(lngCnt, 0)
            strTextdata(1) = vsFlexGrid1.TextMatrix(lngCnt, 1)
            strTextdata(2) = vsFlexGrid1.TextMatrix(lngCnt, 2)
            strTextdata(3) = vsFlexGrid1.TextMatrix(lngCnt, 3)
            strTextdata(4) = vsFlexGrid1.TextMatrix(lngCnt, 4)
            strTextdata(5) = vsFlexGrid1.TextMatrix(lngCnt, 5)
            strTextdata(6) = vsFlexGrid1.TextMatrix(lngCnt, 6)
            strTextdata(7) = vsFlexGrid1.TextMatrix(lngCnt, 7)
            strTextdata(8) = vsFlexGrid1.TextMatrix(lngCnt, 8)
            strTextdata(9) = vsFlexGrid1.TextMatrix(lngCnt, 9)
            strTextdata(10) = vsFlexGrid1.TextMatrix(lngCnt, 10)
            strTextdata(11) = vsFlexGrid1.TextMatrix(lngCnt, 11)
                
        Next
       
       strsql = "SELECT * " & "FROM strTextData(lngCnt) "
       db.Execute strsql
        
   End Sub


ガッ  2005-12-02 18:14:27  No: 128504

> strsql = "SELECT * " & "FROM strTextData(lngCnt) "
↑は意味的に↓こっちの方がしっくり来ると思う。
% strsql = "SELECT * " & "FROM " & strTextData(lngCnt)


U  2005-12-02 18:20:29  No: 128505

基本的にはGridから値を取得し、
SQL文を作成、発行(Execute)する方針になるかと

新規追加行であるならば、
strsql = "INSERT INTO " & "strTextData(lngCnt) 〜"で 

更新行であれば
strsql = "UPDATE " & "strTextData(lngCnt) " & "Set 項目名=" & vsFlexGrid1.TextMatrix(lngCnt, 11) 

※ちょっと気になったもので、
strsql = "SELECT * " & "FROM strTextData(lngCnt) "

strsql = "SELECT * FROM" & strTextData(lngCnt)


みそ  2005-12-02 18:34:42  No: 128506

>ガッ様  U様
ご指導ありがとうございます。
strsqlなんですが自分でも投稿した後ちょっとおかしいとおもって直した次第です。

mdbにはすでにフィールド名のみ入力してあってほかは入力されてない状態です。グリッドのデータをすべてmdbに入れる感じです。

エラーになるとわかりつつも実行してみたところ「オブジェクト変数またはwithブロック変数がありません」とでてしまいました。

変数は全部宣言していると思うのですが・・・・?


U  2005-12-02 18:55:34  No: 128507

> エラーになるとわかりつつも実行してみたところ
>「オブジェクト変数またはwithブロック変数がありません」
> とでてしまいました。

そのエラーは、
  db.Execute strsql
の行で出るのかなぁ〜。

>変数は全部宣言していると思うのですが・・・・?

デバック実行を行った時に、1行1行実行できますが、
上記エラーが出た行で変数が想定外になっていると思います。

エラーが出た行を特定し、
その行で使用している変数を範囲選択し、
右クリック > ウォッチ式に追加...

とやると、値が<オブジェクト変数またはwithブロック変数がありません>
となるはずですので、まず変数の特定しよう。


もげ  2005-12-02 19:04:32  No: 128508

残念ながら、SQL文では配列から一気にMDBへINSERTはできません。

        For lngCnt = 1 To vsFlexGrid1.Rows - 1
            strSQL = "INSERT INTO テーブル名"(項目1,項目2,...) VALUES("
            strSQL = strSQL & "'" & vsFlexGrid1.TextMatrix(lngCnt, 0) & "',"
            strSQL = strSQL & "'" & vsFlexGrid1.TextMatrix(lngCnt, 1) & "',"
'中略  
'というようにSQL文を組み立てて......
            db.Execute strSQL               
        Next
       
とするのがひとつの方法です。

ちなみに、VSFlexGridでしたら、
(せっかくの有料高機能コンポーネントですのでその利点を利用しない手は無いでしょう)
SaveGridメソッドが用意されていますので、
それでCSVファイル化して前回同様の方法で一気にINSERTしてもいいでしょう。


みそ  2005-12-02 19:14:35  No: 128509

>U様

おっしゃるとおり
>db.Execute strsql
のところでエラーになります。

グリッドに表示するCSVファイルのデータを削除して1行だけにして、1行ずつ実行していくと

>strsql = "SELECT * " & "FROM " & strTextdata(lngCnt)

の「strTextdata(lngCnt)」の部分にはいっているものがなぜかほしいデータの一部分しかありませんでした。
この場合、「strTextdata(lngCnt)」の変数宣言が間違っていると考えていいのでしょうか?


ガッ  2005-12-02 19:26:30  No: 128510

データベースを扱った事の無い目で見ると、
> 「オブジェクト変数またはwithブロック変数がありません」
これは、オブジェクト変数に何も参照されていないときに、
そのインスタンスメンバを修飾したときに起こる例外です。
例えばこんなので…
  Dim u As Collection
  Msgbox u.Count

> の「strTextdata(lngCnt)」の部分にはいっているものがなぜかほしいデータの一部分しかありませんでした。
> この場合、「strTextdata(lngCnt)」の変数宣言が間違っていると考えていいのでしょうか?
貴方が「欲しいデータの一部」しかstrTextData(lngCnt)に代入していないからでは?
元のプログラムから察するに、
strTextData(lngCnt) は vsFlexGrid1.TextMatrix(vsFlexGrid1.Rows, 11) となりましょうな…


みそ  2005-12-02 19:27:17  No: 128511

>もげ様
教えていただいて大変恐縮なのですが、「INSERT  INTO」は使うな、といわれておりまして・・・有用だとは思うのですが今やっている段階では使うことができないのです。
こちらの説明不足で申し訳ありません。

SaveGridメソッドは初耳です。
ちょっとヘルプで調べてみますね。


もげ  2005-12-02 19:41:44  No: 128512

>「INSERT  INTO」は使うな、といわれておりまして・・・
...orz

では、RecordsetのAddNewメソッドなら許されるのかどうか判りませんが、
そちらを調べてみてください。


U  2005-12-02 19:45:11  No: 128513

>「INSERT  INTO」は使うな、といわれておりまして・・・

UPDATEを使えってことなのかなぁ


もげ  2005-12-02 20:00:11  No: 128514

U殿>UPDATEを使えってことなのかなぁ

みそ殿>mdbにはすでにフィールド名のみ入力してあってほかは入力されてない状態です。
とおっしゃっているので、空のテーブルが用意されていると解釈しましたが、
SELECTやUPDATEではGridからのデータはテーブルに入りませんよね。

みそ殿がその上司?殿からどのような指示を受けているかわかりませんが、
SQL文を使うな  なのか、はたまた指示を誤解していらっしゃる可能性をありますね。
ここでのやり取りを印刷して、上司殿に見せたほうが解決が早いのか...
(いや、ここで下請けになる気は無いので、仕様を再確認ください  という意味で)


みそ  2005-12-02 20:13:30  No: 128515

>もげ様

>RecordsetのAddNew
こちらは使っても良いといわれました。
一応ヘルプをみたのですが具体的な使い方がわからなく、思考中です。

>U様
>UPDATA
こちらをつかうとしたらどういった使い方をすればいいのでしょうか?
<UPDATE>ってデータを変更するときに使うものですよね?
私の場合、mdbに新規でグリッド表示データをいれるってことですから・・・
ど、どうなるんでしょう???


みそ  2005-12-02 20:19:44  No: 128516

>もげ様

えっとですね、すごい大雑把な説明しかされてなくて私自身もなにをつかっていいのかどれがダメなのかイマイチわからないんです(^^;)
わかっているのは

★SQL文は使ってもいいけど(むしろ使って)INSERT INTOはダメ
★CSVファイルを直接mdbにいれるのではなくてあくまでもグリッドに一度表示して、表示されたものをmdbに入れなさい

すごいアバウトで申し訳ないです。
上司がきたらまた詳しく聞いてみます。午後2時くらいになるかと。


もげ  2005-12-02 20:31:06  No: 128517

ではAddNewで。
http://www.microsoft.com/japan/msdn/data/techmat/ado/dao2ado_3.asp
の[新しいレコードの追加]のあたりをご参考まで。


みそ  2005-12-03 00:31:50  No: 128518

なんとか解決できました。
ご教授くださったガッ様、もげ様、U様本当にありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加