データの判別とテーブル処理の方法

このQ&Aのポイント
  • データを比較し、既存データを更新または新規データを追加するテーブル処理の方法について質問します。
  • 上記の命令で既存データは正常に更新できますが、新規データの処理でエラーが発生します。
  • 「オブジェクト参照がオブジェクトインスタンスに設定されていません」というエラーメッセージが表示されます。解決方法を教えてください。
回答を見る
  • ベストアンサー

データを判別してのテーブル処理

データの内容を比較して、すでにあるデータ(キーで判別)は書き換え、ない場合はレコードの追加処理をしたいと思います。 Me.PASSTableAdapter.Fill(Me.YOSAN_SYSDataSet.PASS) Dim UserData As YOSAN_SYSDataSet.PASSRow Dim newRow As DataRow = YOSAN_SYSDataSet.PASS.NewRow Do UserData = Me.YOSAN_SYSDataSet.PASS.FindByID(LogonUser(0, LogCount).Text) If UserData.Table.Rows.Count <> 0 Then <==ココで落ちる   UserData.PASS = LogonUser(1, LogCount).Text   UserData.NAME = LogonUser(2, LogCount).Text Else newRow(0) = LogonUser(0, LogCount).Text newRow(1) = LogonUser(1, LogCount).Text newRow(2) = LogonUser(2, LogCount).Text YOSAN_SYSDataSet.PASS.Rows.Add(newRow) End If Me.PASSTableAdapter.Update(Me.YOSAN_SYSDataSet.PASS) LogCount += 1 Loop While LogonUser(0, LogCount).Text <> ""  上記の命令ですと、すでにあるデータ(更新)処理はうまくいくのですが、新規データの場合矢印の場所で「オブジェクト参照がオブジェクトインスタンスに設定されておりません」とエラーになってしまいます。  どうしたらよろしいでしょうか?

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

  • ベストアンサー
  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.1

VB.NET のバージョンがわからないので、回答が二分しますが、 UserData.Tableが、Nothingだから、落ちているのでは? ■VS.NET2005を使っている場合 If UserData.Table IsNot Nothing AndAlso _   UserData.Table.Rows.Count <> 0 Then  編集処理 End If ■VS.NET2002, 2003を使っている場合 If Not UserData.Table Is Nothing Then   If UserData.Table.Rows.Count <> 0 Then    編集処理   End If End If で、試してみてください。

gonta_256
質問者

お礼

If UserData.Table IsNot Nothing ではなく If UserData IsNot Nothing だとうまくいきました。 ありがとうございます。

gonta_256
質問者

補足

回答ありがとうございます。 VBは2005を使っています(^^; そこで、教えていただいた構文を入れてみましたが、結果は同じでした。 Tryで囲っているのですが、囲わない方がいいのかと考えております。

関連するQ&A

  • 配列と互換性のない型の要素にアクセスしようとしまし

    以下のソースでサブルーチン呼び出し行で例外「配列と互換性のない型の要素にアクセスしようとしました」が出ます。 -------------------------------------------------------------------------- Private Sub メインルーチン()  Dim Rows() As Data.DataRow = MyDataSet.Tables(MyTableName).Select("条件") if Rows.Count <> 0 then サブルーチン (Rows(0)) end if End Sub Private Sub サブルーチン(ByRef Row As Data.DataRow) '処理 End Sub ---------------------------------------------------------------------------- サブルーチンを呼び出す前に以下のようにするとエラーはでません。 Dim Row as Data.DataRow = Rows(0) サブルーチン (Row) これはなぜなのでしょうか?RowはData.DataRow型であり、配列の要素Rows(0)もData.DataRow型でありエラーが出る意味が分からないのですが。

  • WEBアプリでデータを書き込む

    visual web developerを使用してwebアプリケーションを作っています。 住所氏名一覧表に、 あらたに住所氏名を加えていく入力フォームを作成しています。 すべてのデータにIDを自動出来に加えたいのですが 元データをXMLファイルにすると 自動でIDをふる方法がわかりません。 元データをACCESSファイルにすると データの「登録」ボタンを押した際 ”別のプロセスで使用されているため、プロセスはファイル××にアクセスできません。” と出てしまいます。 できれば後者の方法(ACCESS形式)で運用したいのですが のどようにすればいいのでしょうか? 教えてください! 以下は「登録」ボタンのコードです。 Protected Sub Button_Add_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button_Add.Click ' データベースファイルのパスを定義する Dim UpFolder_URL As String = "~/Chap4/Upload_data/" Dim UpFolder As String = Server.MapPath(UpFolder_URL) Dim DBFile As String = UpFolder + "database.mdb" ' データベースのデータを読み込む Dim albumDS As New Data.DataSet() albumDS.ReadXml(DBFile) Dim table As Data.DataTable = albumDS.Tables("item") ' 新しい行をテーブルに追加する Dim newRow As Data.DataRow = Table.NewRow() newRow("Date") = DateTime.Today.ToLongDateString() newRow("Name") = Name.Text newRow("Contents") = Contents.Text newRow("Add") = Add.Text newRow("Method") = Method.Text table.Rows.Add(newRow) ' データをデータベースファイルに書き出す albumDS.WriteXml(DBFile) ' GridViewの表示を更新する GridView1.DataBind() End Sub

  • この行は既に別のテーブルに属しています

    以下のソースで、「この行は既に別のテーブルに属しています。」というエラーが出てしまいますが、対処方法がわかりません。 どのようにしたらよろしいでしょうか? VS2003のVBです。     Dim Table1 As DataTable = Me.DS1.Tables("データベース1")     Dim Table2 As DataTable = Me.DS1.Tables("データベース2")     Dim Row1 As DataRow     Dim Row2 As DataRow     Row1("データ1") = 1     Row1("データ2") = 2     Row1("データ3") = 3     Row2("データ1") = 2     Row2("データ2") = 3     Row2("データ3") = 4     Table2.Rows.Add(Row2) ←ここでエラー     Table1.Rows.Add(Row1) 'System.ArgumentException' のハンドルされていない例外が system.windows.forms.dll で発生しました。 追加情報 : この行は既に別のテーブルに属しています。

  • DataGridViewでitemを指定してデータ

    DataGridViewでitemを指定してデータを取得する事はできますか? 下記のように座標を指定して取得する方法はわかります。 Dim IntItem1 As Integer = DataGridView1(j, i).Value DataSetの場合は、DataRowに落として取れます。 Dim DataRow1 As DataRow = DataSet1.Tables("Table1").Rows(0) Dim IntItem1 As Integer = DataRow1("Item1") 同じノリで DataGridViewからアイテムを指定してデータを取得したいのですが下記のような事はできませんでした。 Dim DataGridViewRow1 As DataGridViewRow = DataGridView1.Rows(0) Dim IntItem1 As Integer = DataGridViewRow1("Item1") ← エラー 書き方があれば教えて下さい。

  • vbでDataTableの抽出コピー

    vbでDataTableの抽出コピー DataTableから条件抽出したデータで別のDataTableを作成したい ・DataTable1から条件抽出したデータで別のDataTableを作成したい ・データの件数が違うだけでヘッダーなどの内容は同じにしたい Dim DataTable1 As DataTable ' 既にテーブルデータが入っているとする Dim DataTable2 As DataTable ' これに一部のデータとヘッダーを複写 Dim DataRow1 As DataRow ' DataRowの一時領域1 Dim DataRow2 As DataRow ' DataRowの一時領域2 <試作1:NG DataRowの使いまわしがきかない> DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataTable2.Rows.Add(DataRow1) Next DataRow1 <試作2:NG ワンクッションかましただけではダメ> DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataRow2 = DataRow1 DataTable2.Rows.Add(DataRow2) Next DataRow1 もしかして、個別セット以外に道はないのでしょうか? DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataRow2 = DataTable2.NewRow DataRow2("item1") = DataRow1("item1") DataRow2("item2") = DataRow1("item2") DataRow2("item3") = DataRow1("item3") DataRow2("item4") = DataRow1("item4") DataRow2("item5") = DataRow1("item5") DataRow2("item6") = DataRow1("item6") DataRow2("item7") = DataRow1("item7") DataRow2("item8") = DataRow1("item8") DataTable2.Rows.Add(DataRow2) Next DataRow1 何か良い方法はありませんか?

  • 型付されたデータセットの親テーブル参照について

    型付されたデータセットの親テーブル参照について教えていただきたいです。 CategoriesテーブルのCategoryIDとProductsテーブルのCategoryID で親子リレーションを作成しています。  親子両方のテーブルを読み込めば、型付されたデータセットでは、  DataTable_prod(0).CategoriesRow.CategoryName  のように親情報を取得できると考えているのですが、この行で オブジェクト参照がオブジェクト インスタンスに設定されていません  が出てしまいます。  何が原因かわかる方がいれば、教えていただきたいと思います。  (参考にした本 Web+DB press Vol.23 p.107-111)  よろしくお願いいたします。 Partial Class _Default Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then Dim Adp_cate As New ProductDataSetTableAdapters.CategoriesTableAdapter '* AdapterのSelectCommand 'SELECT DISTINCT Categories.CategoryID, Categories.CategoryName 'FROM Products INNER JOIN ' Categories ON Products.CategoryID = Categories.CategoryID Dim DataTable_cate As New ProductDataSet.CategoriesDataTable Adp_cate.Fill(DataTable_cate) Dim Adp_prod As New ProductDataSetTableAdapters.ProductsTableAdapter '* AdpterのSelectCommand 'SELECT ProductID, ProductKana, ProductName, SupplierID, CategoryID, QuantityPerUnit, 'UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued 'FROM(Products) Dim DataTable_prod As New ProductDataSet.ProductsDataTable Adp_prod.Fill(DataTable_prod) 'products.ProductNameを得る Dim pName As String = DataTable_prod(0).ProductName Label1.Text = pName 'products.ProductIDを得る Dim pID As String = DataTable_prod(0).ProductID Label2.Text = pID 'products.CategoryIDを得る Dim cID As String = DataTable_prod(0).CategoryID Label3.Text = cID 'リレーションを辿って、CategoryNameを得る '※以下の行で、オブジェクト参照がオブジェクト インスタンスに設定されていません。のエラー Dim cName As String = DataTable_prod(0).CategoriesRow.CategoryName Label4.Text = cName End If End Sub End Class

  • DataGridViewで教えてください。

    DataGridViewで教えてください。 VB初心者ですが どうかよろしくお願いいたします。 VB2005で DataGirdView(dgv1)の始めの行を 他のDataGridView(dgv2)に追加したいのですが、 うまくいきません。 どうすればよいのでしょうか? すみませんが、 教えてください。 よろしくお願いします。 Dim Table As DataTable Dim MainTable As DataTable Dim row As DataRow Table = DirectCast(dgv1.DataSource, DataTable) MainTable = DirectCast(dgv2.DataSource, DataTable) row = MainTable.NewRow row = Table.Rows(0) MainTable.Rows.Add(row)

  • MDBテーブルへの追加変更を教えてください

    いつもお世話になってます。VB2005の初心者の質問です。 データの変更頻度が少ないのでMDBテーブルをDataGridViewの表示させて行の状態から追加変更したいのですが肝心な部分がわかりません。 DB名=NO.MDB テーブル名=番号 (IDNO、addres、TELNO の3項目です) Private Sub 更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 更新.Click Dim dSet As DataSet = New DataSet("番号") Dim cn As OleDb.OleDbConnection =   NewOleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=NO.mdb;") Dim dRow As DataRow Dim dTbl As DataTable Dim i As Integer dTbl = DataGridView1.DataSource For i = 0 To dTbl.Rows.Count - 1 If dTbl.Rows(i).RowState = DataRowState.Added Then MessageBox.Show(i, "件目") →デバック表示です ??????? Addedならレコードの追加をしたいです End If Next End Sub ご回答よろしくお願いいたします。

  • 【ASP.NET】DataSetをSqlDataSourceに組み込めますか?

    ASP.NET Visual Studio 2005で開発を行っています。 GridViewのページングの機能を使用するには、「SqlDataSource」や「ObjectDataSource」を使用しないと有効にならないと思いますが、データベースがDataSetになっています。 この状態から、GridViewにデータをバインドし、ページングを有効にさせるには、どうしたらよいでしょうか?? SqlDataSourceにDataSetを持っていくという方法が調べても、分かりませんでした。 以下が使用しているソースです。 これですと、ページングが有効にならず、エラーになる状態です。 ============================================= Dim dSet As Data.DataSet = New Data.DataSet("データ") Dim dTbl As Data.DataTable Dim dRow As Data.DataRow dTbl = dSet.Tables.Add("データ") dTbl.Columns.Add("aaa", Type.GetType("System.String")) dRow = dTbl.NewRow() dRow("aaa") = "bbb" dTbl.Rows.Add(dRow) Me.GridView1.DataSource = dTbl Me.GridView1.DataBind() ====================================== どうぞ、宜しくお願いします。

  • 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

専門家に質問してみよう