VB2005でOracleのレコード操作について

このQ&Aのポイント
  • VB2005よりOracleに接続しレコードをテキストに吐き出す単純なプログラムなのですが、テーブルの複数レコードを1レコードにする方法を教えてください。
  • 具体的なコードとしては、VB2005からOracleに接続し、指定のテーブルからデータを取得し、それをテキストに出力するプログラムです。
  • 他にも良い方法があれば教えてください。
回答を見る
  • ベストアンサー

VB2005でOracleのレコード操作について

こんばんわ! VB2005よりOracleに接続しレコードをテキストに吐き出す単純なプログラムなのですが、以下のようなテーブルの複数レコードを以下のテキスト結果のように1レコードにしたいのですが。。 <テーブル> ID  名称   明細数 回数 1 あああ   2 3 1 いいい 2 3    ↓ <テキスト結果> ID,明細数,名称1,回数1,名称2,回数2 1,2,あああ,3,いいい,3 <コード> con.ConnectionString = ("User ID=XXX;Password=XXX;Data Source=XXX") con.Open strsql = "select * from XXX" comm = New OracleCommand(StrSql, con) My.Computer.FileSystem.WriteAllText(Path,"",False,enc) dr = comm.ExecuteReader Do Until dr.Read = False strEdit(dr) Loop Function strEdit(Byval Dr As OracleDataReader) As Boolean ・   ・   ・ OutStr &= Dr("ID") if Dr("明細数") >= 2 Then 【ここでADOの「MoveNext」と同等なもの】   End If OutStr &= vbCrLf My.Computer.FileSystem.WriteAllText(Path,OutStr,True,enc) end Function 又は他に良い方法があればご教授いただけませんでしょうか? 宜しくお願い致します。

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

  • ベストアンサー
noname#259269
noname#259269
回答No.1

>【ここでADOの「MoveNext」と同等なもの】 純粋にこの問いに答えるのであれば、DR.Read でいいんじゃないでしょうか。 ただ、明細数というのは、SELECT 結果の複数行を、出力時に1行にまとめる単位なのでしょうか? であれば、ロジック↓の組み方に何か違和感覚えますが、 >if Dr("明細数") >= 2 Then 全部掲載されているわけではなさそうですので、まずはこの回答にて。

ryozyryozy
質問者

補足

ご回答ありがとうございます! >ただ、明細数というのは、SELECT 結果の複数行を、出力時に1行にまとめる単位なのでしょうか? そのとおりです。 >であれば、ロジック↓の組み方に何か違和感覚えますが、 たしかに不恰好な気もします。 IDがキーとなり、明細数分だけ列が増えていき、IDが変われば改行していきます。 でも以下のようにしたら一応上手くいってそうですが。。 If Dr("明細数") >= 2 Then Dr.Read() End If どうすればもっとスマートになるんでしょうか? なにかいいやり方ご存知でしょうか?

その他の回答 (1)

noname#259269
noname#259269
回答No.2

>でも以下のようにしたら一応上手くいってそうですが。。 データが仮にこうだったらどうなりますか? ID 名称 明細数 回数 1 あああ 2 3 1 いいい 2 3 2 ううう 2 4 2 えええ 2 4 ID毎にキーブレイクするんなら問題ないと思います。そういう意味でソースが全文掲載されていないので。。。と書きました。

関連するQ&A

  • Oracleのデータ抽出をShiftJIS変換するには?

    VisualStudio2005の環境にて、Oracleのテーブルに格納されている文字列を以下のようにCSVファイルに抽出するだけの単純なプログラムなのですが、テキストエディタで開くと「UTF-8」となっており、文字化けする場合があります。これをShift-JIS等に変換するにはどうすればいいのでしょうか? 'オラクル接続 con.ConnectionString = ("User ID=aaa;Password=aaa;Data source=aaa") con.Open() StrSQL = "select * from table1" comm = New OracleCommand(StrSQL,con) My.computer.FileSystem.WriteAllText(path,"",false) dr = comm.ExecuteReader Do Until dr.Read = False StrEdit(dr) Loop Function StrEdit(Byval Dr As OracleDataReader) as Boolead Dim OutStr as string = "" OutStr &= "'" & Dr("col1").ToString & "'" 中略 OutStr &= vbCrLf My.computer.FileSystem.WriteAllText(path,OutStr,false) End Function どうか宜しくお願い致します。

  • DetailsViewで指定されたレコード表示したい

    Visual Studio 2008で作業しています。 DetailsViewコントロールを使用してAcessDBのレコードの内容を表示しています。この画面は、他の画面で、レコードの一覧を表示し、その一覧で、あるレコードが選択されたときに呼び出されます。この画面で、そのレコードの詳細を表示したいと考えています。レコードには主キーがIDという名称で登録されています。この画面にきたとき、(他の画面で選択した)IDの値を取り出すところまでは、出来たのですが、このIDを指定して、SQL文を発行し、このレコードを取得する方法がわかりません。(現在のSQLステートメントは、select ID,項目1,項目2 ... from table_A のようになっており、 where 句をつけていません。取得したIDをテキストボックスにセットし、where (ID = TextBox1.[Text])のようにしたのですが、実行時に異常終了していまいました。) DetaisViewで、指定されたレコードを表示する方法をご存じのかたがおりましたら教えてください。

  • VBで文書を検索するシステムを作ったのですが、検索実行のたびに表示されるレコードが増えます。

    VBで文書検索を行うシステムを作っているのですが、文字列を変えて検索するたびにMSHFlexGrid上に表示されるレコードが増えていきます。原因がわかりません。よろしくお願いします。 Private Sub Command1_Click() Dim kubun As String '文字列型 Dim mojiretsu_k As String '文字列型 Dim A As Integer ' Dim cn As New ADODB.Connection 'データベースに接続するためのコネクションオブジェクト Dim cmd As ADODB.Command Dim rst As ADODB.Recordset Dim strSQL As String Dim i As Integer If Option7 = True Then ElseIf Option8 = True Then kubun = "a" ElseIf Option9 = True Then kubun = "b" ElseIf Option10 = True Then kubun = "c" ElseIf Option11 = True Then kubun = "d" ElseIf Option12 = True Then kubun = "e" ElseIf Option13 = True Then kubun = "f" ElseIf Option14 = True Then kubun = "g" ElseIf Option15 = True Then kubun = "h" ElseIf Option16 = True Then kubun = "i" ElseIf Option17 = True Then kubun = "j" End If Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Persist Security Info=False;" & _ "Data Source=aaa.mdb;" & _ "Mode=Read" cn.Open Set rst = New ADODB.Recordset ' レコードソースにSQL文を指定 mojiretsu_k = Text1.Text If Option18.Value = True Then '現行文書のみ検索 If Option7.Value = True Then strSQL = "Select 資料区分,資料名称,ファイルパス From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 廃止フラグ = False order by ID" Else strSQL = "Select 資料区分,資料名称,ファイルパス From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 資料区分 = """ & kubun & """ and 廃止フラグ = False order by ID" End If ElseIf Option19.Value = True Then '廃止文書のみ検索 If Option7.Value = True Then strSQL = "Select 資料区分,資料名称,ファイルパス,廃止フラグ From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 廃止フラグ = true order by ID" Else strSQL = "Select 資料区分,資料名称,ファイルパス,廃止フラグ From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 資料区分 = """ & kubun & """ and 廃止フラグ = true order by ID" End If ElseIf Option20.Value = True Then '現行+廃止文書を検索 If Option7.Value = True Then strSQL = "Select 資料区分,資料名称,ファイルパス,廃止フラグ From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' order by ID" Else strSQL = "Select 資料区分,資料名称,ファイルパス,廃止フラグ From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 資料区分 = """ & kubun & """ order by ID" End If End If rst.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText i = 0 Do While Not rst.EOF With Form1.MSHFlexGrid1 .AddItem "" .TextMatrix(i, 0) = rst.Fields("資料区分") .TextMatrix(i, 1) = rst.Fields("資料名称") .TextMatrix(i, 2) = rst.Fields("ファイルパス") End With i = i + 1 rst.MoveNext Loop rst.Close cn.Close Set rst = Nothing Set cn = Nothing End Sub

  • レコードの削除について

    VB2005、SQLServer2005環境です。 度々質問させていただきます。コード1、コード2、コード3を主キーに持つAテーブルがあります。 そのテーブルからある特定レコードを削除したいのですが、 targetRow = dt.Rows.Find(findTheseVals(2)) のところでエラーになります。 エラー内容は、インデックスを付加するキーには 3 値が必要ですが、1 値を取得しました。 いったいどういう意味なのでしょうか?FINDする時の書き方が悪いのでしょうか? ご教授お願いします。 Private Sub BTN_削除_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BTN_削除.Click Dim strsql As String Dim findTheseVals(2) As Object '///DB接続 省略/// strsql = "SELECT * FROM Aテーブル" Dim comm As SqlCommand = New SqlCommand(strsql, Con) Try Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "Aテーブル") Dim dt As New DataTable dt = ds.Tables("Aテーブル") Dim targetRow As DataRow targetRow = dt.NewRow() findTheseVals(0) = TXT_コード1.Text findTheseVals(1) = TXT_コード2.Text findTheseVals(2) = TXT_コード3.Text targetRow = dt.Rows.Find(findTheseVals(2)) ←ここでエラー targetRow.Delete() Dim cb As SqlCommandBuilder = New SqlCommandBuilder(dataadapter) dataadapter.Update(ds, "Aテーブル") Catch oExcept As Exception '例外が発生した時の処理 Finally '///DB切断省略/// End Try End Sub

  • .net データベースへ反映する方法

    <環境> 言語:Microsoft Visual Studio 2008 データベース:SQL Server 2005 非接続型のデータアクセスです。 以前同じ質問をさせていただいたのですが、解決できなかったため、再度投稿させていただきました。 <質問> DataGridViewにデータを表示し、登録、修正、削除を行った後、 更新ボタンを押下でDataGridViewの内容をデータベース(SQLServer)に反映したいのですが、エラーとなり反映できません。 http://japan.internet.com/developer/20070522/26.html を参考にしているのですが、四苦八苦。全然前に進めない状態です。 自作したコードを下記の通りです。いったいどこを直せばよろしいでしょうか?どなたかアドバイスよろしくお願いします。 <エラー>---------------------------------------------------------- "System.ArgumentNullException: 値を Null にすることはできません。  パラメータ名: dataTable  場所 System.Data.Common.DbDataAdapter.Update(DataTable dataTable) -------------------------------------------------------------------- Private Sub frmDataGridViewTest_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load   Dim strsql As String   Call DBConnect() 'DB接続   strsql = "SELECT ID, 名称, 型式 FROM ATBL ORDER BY ID"   Dim comm As SqlCommand = New SqlCommand(strsql, Con)   Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)   dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey   Dim ds As DataSet = New DataSet()   dataadapter.Fill(ds, "テーブル")   dgrview.DataSource = ds   dgrview.DataMember = "テーブル"   Call Disconnect() 'DB切断 End Sub Private Sub BTN_更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_更新.Click   Dim strsql As String   Call DBConnect() 'DB接続   strsql = "SELECT ID, 名称, 型式 FROM ATBL ORDER BY ID"   Dim comm As SqlCommand = New SqlCommand(strsql, Con)   Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)   dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey   dataadapter.Fill(ds, "テーブル")   Dim dt As DataTable = ds.Tables("テーブル")   '<<<DataGridViewコントロールでの変更をデータベースに戻す>>>   Dim sqlCmdBuilder As New SqlCommandBuilder(dataadapter)   sqlCmdBuilder.GetUpdateCommand()   dataadapter.Update(ds.Tables("テーブル"))   Call Disconnect() 'DB切断 End Sub

  • GridView1の選択の指定とダミーデータの追加について

    GridView1とTwxtBox1を用意し GridView1に選択ボタンをつけ押すと、TextBox1にその行の1行目を表示するようにしたいのですが ★に何を入れたら、選択行を指定することができるのでしょうか?教えてください。 Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) TextBox1.Text = GridView1.Rows.Item(★).Cells(1).Text End Sub Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString Dim strSQL As String strSQL = "SELECT 1CELL FROM tableA" Using con As New SqlConnection(conStr) Using cmd As NEw SqlCommand(strSQL, con) Dim dr As SqlDataReader con.Open() dr = cmd.ExecuteReader(Data.CommandBehavior.CloseConnection) GridView1.DataSource = dr GridView1.DataBind() dr.Close() End Using End Using End Sub また、GridView1に出ているデータに選択するデータがない場合の為に データーベースにはなくても【-】というデータを常に表示できるようにしたいのですが どのようにしたらいいのでしょうか? 【tableAの1CELL】 AAAAA BBBBB CCCCC DDDDD - ←データベースにはこのデータはないけれどGridView1には常に表示し、これを選択するとTextBox1に【-】が入るようにしたいのですが よろしくお願いします。

  • Excel VBA EOFに関して

    テキストボックスにDateを入力し、SQLServerに接続しSelectの結果をシートに書き込むだけのものなのですが、「BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています」というエラーでさっぱりわかりません。どなたかアドバイスをお願い致します。 -前後省略- stdate = UserForm1.stdate.Value endate = UserForm1.endate.Value strsql = "select ***" strsql = strsql & "from ***" strsql = strsql & "where *** and ***.start_date between '" & stdate & "' and '" & endate & "' " con.Open connectionString Set rs = con.Execute(strsql) Sheets("Data1").Select rs.MoveFirst i = 2 Do Until rs.EOF Cells(i, 1) = rs.Fields(0).Value Cells(i, 2) = rs.Fields(1).Value Cells(i, 3) = rs.Fields(2).Value Cells(i, 4) = rs.Fields(3).Value i = i + 1 rs.MoveNext Loop con.Close Set con = Nothing Exit Sub Err_DBConnectOpen: MsgBox Err.Description If con.State <> ADODB.adStateClosed Then con.Close End If Set con = Nothing End Sub

  • vb.net トランザクション処理について

    VB2005、SQLServer2005環境です。 VB.Netのトランザクション処理でエラーが発生します。 エラー内容の意味すらわかりません。 どなたかご教授お願いします。 *エラー内容 "System.InvalidOperationException: ExecuteReader は、コマンドに割り当てられた接続が保留状態である ローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。 コマンドの Transaction プロパティがまだ初期化されていません。 Private Sub BTN_更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_更新.Click Dim strsql As String Dim Tran As SqlClient.SqlTransaction = Nothing '---DB接続 Call DBConnect() Try '---SQL文作成 strsql = "SELECT * FROM Aテーブル" '---SQL文を作成して実行する Dim comm As SqlCommand = New SqlCommand(strsql, Con) '---データアダプタの作成 Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) '---データセットへの読み込み Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "Aテーブル") Dim dt As New DataTable dt = ds.Tables("Aテーブル") '---主キーの設定 dt.PrimaryKey = New DataColumn() {dt.Columns("Aテーブル")} '---データの更新 Dim targetRow As DataRow targetRow = dt.NewRow() targetRow = dt.Rows.Find(TXT_コード.Text) targetRow("コード") = TXT_コード.Text targetRow("氏名") = TXT_氏名.Text '---コマンド自動作成 Dim cb As SqlCommandBuilder = New SqlCommandBuilder(dataadapter) '---トランザクション開始 Tran = Con.BeginTransaction() '---データベースの更新 dataadapter.Update(ds, "社員テーブル")     <<<エラーになります。 '---トランザクション完了 Tran.Commit() Catch oExcept As Exception '---ロールバック Tran.Rollback() '例外が発生した時の処理 MessageBox.Show(oExcept.ToString, "例外発生") Finally '---DB切断 Call Disconnect() End Try

  • 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

  • VB6でmdbファイルのレコードを検索かけた場合に時折エラーがでます。

    VB6.0を使って資料のデーターベースを作っているのですが、質問させてください。 アクセスのmdbファイルからデータを読みとり、Command1ボタンを押した際にテキストボックスに入力した任意の文字列が含む資料名のレコードを抽出する機能を持たせています。 また、OPTIONボタンでA~Jまでの資料区分ごとに絞り込みを行う機能(option7を押した場合は全資料区分から検索)も持たせているのですが、テキストボックスに文字列を入力後、OPTIONボタンで資料区分Aを検索⇒Command1ボタン⇒OPTIONボタンで資料区分B⇒Command1ボタン等のように繰り返しての検索をすると時折フリーズして動かなくなります。特に該当レコードが0の後に発生する場合が多いようです 原因が分からず困っています。よろしくお願いします。 Private Sub Command1_Click() Dim kubun As String '文字列型 資料の区分 Dim mojiretsu_k As String '文字列型 検索用文字列 Dim a As Integer If Option7 = True Then'全文書区分から検索 ElseIf Option8 = True Then kubun = "A" ElseIf Option9 = True Then kubun = "B" ElseIf Option10 = True Then kubun = "C" ElseIf Option11 = True Then kubun = "D" ElseIf Option12 = True Then kubun = "E" ElseIf Option13 = True Then kubun = "F" ElseIf Option14 = True Then kubun = "G" ElseIf Option15 = True Then kubun = "H" ElseIf Option16 = True Then kubun = "I" ElseIf Option17 = True Then kubun = "J" End If ' 接続文字列を設定 Adodc1.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Persist Security Info=False;" & _ "Data Source=資料.mdb;" & _ "Mode=Read" ' レコードソースにSQL文を指定 mojiretsu_k = Text1.Text If Option18.Value = True Then '現行文書のみ検索 If Option7.Value = True Then'全文書区分から検索 Adodc1.RecordSource = "Select 資料区分,資料名称,ファイルパス From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 廃止フラグ = False order by ID" Else'指定された資料区分で検索 Adodc1.RecordSource = "Select 資料区分,資料名称,ファイルパス From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 資料区分 = """ & kubun & """ and 廃止フラグ = False order by ID" End If ElseIf Option19.Value = True Then '廃止文書のみ検索 If Option7.Value = True Then Adodc1.RecordSource = "Select 資料区分,資料名称,ファイルパス,廃止フラグ From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 廃止フラグ = true order by ID" Else Adodc1.RecordSource = "Select 資料区分,資料名称,ファイルパス,廃止フラグ From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 資料区分 = """ & kubun & """ and 廃止フラグ = true order by ID" End If ElseIf Option20.Value = True Then '現行+廃止文書を検索 If Option7.Value = True Then Adodc1.RecordSource = "Select 資料区分,資料名称,ファイルパス,廃止フラグ From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' order by ID" Else Adodc1.RecordSource = "Select 資料区分,資料名称,ファイルパス,廃止フラグ From T_SHIRYO WHERE 資料名称 like'%" & mojiretsu_k & "%' and 資料区分 = """ & kubun & """ order by ID" End If End If ' データを再取得 Adodc1.Refresh With MSHFlexGrid1 .FocusRect = flexFocusNone .HighLight = flexHighlightAlways End With End Sub

専門家に質問してみよう