「この行は既に別のテーブルに属しています。」というエラーが発生しています。対処方法は?

このQ&Aのポイント
  • VS2003のVBで、以下のソースコードを実行した際に「この行は既に別のテーブルに属しています。」というエラーが発生します。
  • エラーが発生する原因は、Table2に既に行(Row2)が属している状態で再度Table2に行を追加しようとしたためです。
  • 対処方法としては、Row2をTable2から削除するか、新たな行(Row3)を作成してTable2に追加することが考えられます。
回答を見る
  • ベストアンサー

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

以下のソースで、「この行は既に別のテーブルに属しています。」というエラーが出てしまいますが、対処方法がわかりません。 どのようにしたらよろしいでしょうか? 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 で発生しました。 追加情報 : この行は既に別のテーブルに属しています。

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

  • ベストアンサー
回答No.2

お世話になります。 > Dim Row1 As DataRow > Row1("データ1") = 1 これは、実行時に例外(NullReferenceException)が発生するはずです。 > Row1("データ1") = 1 こちらを実行する前に、 Row2 = Table1.Rows(0) とか Row2 = Table1.NewRow とかやってると仮定して、 2 つの DataTable のレイアウトが全く同じならば DataTable.ImportRow メソッド を使われてはいかがでしょうか。 Dim dt As DataTable = New DataTable dt.Columns.Add("Field1", GetType(String)) dt.Columns.Add("Field2", GetType(String)) dt.Columns.Add("Field3", GetType(String)) dt.Rows.Add(New String() {"りんご", "みかん", "ばなな"}) dt.Rows.Add(New String() {"おかし", "ごはん", "おちゃ"}) Dim copyToDt As DataTable = dt.Clone() For Each row As DataRow In dt.Rows   If Convert.ToString(row("Field1")) = "おかし" Then     copyToDt.ImportRow(row)   End If Next

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfSystemDataDataTableClassImportRowTopic.
ymda
質問者

お礼

この方法でできました。ありがとうございます。

その他の回答 (1)

  • ape5
  • ベストアンサー率57% (85/148)
回答No.1

検証環境:WinXP SP2 VisualStudio.NET 2002 同じコードでやったのですが、ymdaさんと違うところでエラーが出ました。 で、エラーを解除するために以下のコードを追加しました。     ・・・・・・・・     Dim Row2 As DataRow -------------------------------------- Row1 = Table1.NewRow() ここです Row2 = Table2.NewRow() --------------------------------------     Row1("データ1") = 1     Row1("データ2") = 2     ・・・・・・・・・ これで、エラーは無くて動作します。 同じ環境ではないので、なんともいえませんが、よろしければ試してみてください。

関連するQ&A

  • 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)

  • 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 何か良い方法はありませんか?

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

    以下のソースでサブルーチン呼び出し行で例外「配列と互換性のない型の要素にアクセスしようとしました」が出ます。 -------------------------------------------------------------------------- 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型でありエラーが出る意味が分からないのですが。

  • データベースのDataRowの使い方について

    環境: Windows7 MicrosftVisualStudio 2013 SQLServer 2014 言語 C# .Net 通常以下のようにしてDataRowを作って使用しますが、 DataSet ds = new DataSet(); DataTable dt = new DataTable("Table1"); dt.Columns.Add("商品番号"); dt.Columns.Add("商品名"); dt.Columns.Add("価格"); ds.Tables.Add(dt); DataRow datarow = ds.Tables["Table1"].NewRow(); データソースと同じ列を使用したいので データセット  : MAINDataSet データテーブル : MASTERDataTable MAINDataSet.MASTERDataTable dtMaster = new MAINDataSet.MASTERDataTable(); として新規作成を行ったのですが、このままではレコード数が0で、上記の DataRow datarow = dataset.Tables["Table1"].NewRow(); にあたる処理 DataRow dr = MAINDataSet.MASTERDataTable.NewRow(); がわかりません。 現状では この1行の代わりに以下のようなことを毎回しなければ ならないのでしょうか? MAINDataSet.MASTERDataTable dt = new MAINDataSet.MASTERDataTable(); DataSet ds = new DataSet(); DataTable dt = new DataTable("Table1"); for(int inum = 0; inum < dt.Columns.Count; inum++) { dt.Columns.Add(dt.Columns[inum].ColumnName); } ds.Tables.Add(dt); DataRow datarow = ds.Tables["Table1"].NewRow();

  • アクセスDbのテーブル項目属性の取得(VB2005)

    ご協力いただき、table名 field名までは取得できたのですが、種々プロパティを試していますが、fieldの「桁数」「タイプ」がどうしても取得できません。DAoでは .size .type だったのですが。 この部分接続など略(800文字とのことなので) Cn.Open() Dim S As String Dim tbl As DataTable Dim myRows() As DataRow tbl = Cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}) Dim I As Short myRows = tbl.Select() 'S = myRows(1).ItemArray(2) Dim ds As New DataSet For Each row As DataRow In myRows 'MsgBox(row.ItemArray(2)) Dim cmd As New OleDb.OleDbCommand("SELECT * From " + row.ItemArray(2), Cn) Dim dr As OleDb.OleDbDataReader = cmd.ExecuteReader Dim da As New OleDb.OleDbDataAdapter("SELECT * From " + row.ItemArray(2), Cn) da.Fill(ds, row.ItemArray(2)) For I = 0 To dr.FieldCount - 1 S = dr.GetName(I) 'Field name S = ds.Tables(0).Columns(I).ColumnName          この2行は同じものがとれます。 tables columns gettypeなど どれもうまく取得できませんでした。 よろしくご教示ください。

  • 「テーブルに主キーがありません。」というエラーが出て困ってます。

    VisualStudioでASP.NETをやってます。初心者です。 データグリッドの削除ボタンを押して行を削除したいのですが、 テーブルに主キーがありません。というエラーが出てしまいます。 テーブルに主キーはあるんですけれども、原因がわかりません。 Dim mytable As DataTable Dim myrow As DataRow Dim key As String SqlDataAdapter1.Fill(DataSet11) key = DataGrid1.DataKeys(e.Item.ItemIndex) mytable = DataSet11.Tables("テーブル名") ↓ここでエラーになるようです。 myrow = mytable.Rows.Find(key) myrow.Delete() ご存知の方いらっしゃいましたら、よろしくお願いします。

  • DataGridViewに関して

    開発:Visual Basic 2008 考え方の質問になってしまうかもしれませんが教えて下さい。 Datagridviewを用いて、データの入力をさせたいと考えています。 但し、入力だけでなく画面にある表示ボタンを押した際には、テーブルに格納されている データを検索しに行き、その内容を表示させたいと考えています。 Datagridviewはフォームに貼り付け、各項目を一つずつ作成してあります。 しかし、この場合、以下のような記述をすると(そもそも記述が違うかと思われますが・・・)、 もともと作成してある項目(列)にデータがセットされず、新規で列を作ってしまいます。 《記述内容》 '変数の宣言 Dim dtSet As DataSet = New DataSet("PRODUCTS") Dim dtTable As DataTable 'データセットにテーブルを追加する dtTable = dtSet.Tables.Add("A_TBL") 'テーブルにフィールドを追加する '.Add("フィールド名", フィールドの型)で追加します dtTable.Columns.Add("AAA", Type.GetType("System.String")) Dim data_row As DataRow = dtTable.NewRow() data_row("AAA") = PIN_AAA dtTable.Rows.Add(data_row) 'DataGridにデータを表示する G_BBB.DataSource = dtSet.Tables(0) そもそもDatagridviewを用いて、入力や表示を行うにはどのような形にするのが 良いのでしょうか? Datasetとか使う? 教えて頂きたいと思います。 よろしくお願いします。

  • vb .net Winアプリでコンボボックスに値を

    vb .net Winアプリでコンボボックスに値をセットする方法を教えて下さい。 table1 都道府県コード,都道府県名(カナ),都道府県名 01,ホッカイドウ,北海道 02,アオモリケン,青森県 03,イワテケン,岩手県 のテーブルがあり、既に読み込んでいます。 このデータをコンボボックスにセットしたいです。 Dim NpgsqlConnection1 As NpgsqlConnection Dim NpgsqlCommand1 As NpgsqlCommand Dim NpgsqlDataAdapter1 As NpgsqlDataAdapter Dim String1 As String Dim DataTable1 As DataTable NpgsqlConnection1 = New Npgsql.NpgsqlConnection NpgsqlConnection1.ConnectionString = gstrCnct NpgsqlConnection1.Open() String1 = "select * from table1;" NpgsqlCommand1 = New NpgsqlCommand NpgsqlCommand1.Connection = NpgsqlConnection1 NpgsqlCommand1.CommandText = String1 NpgsqlDataAdapter1 = New NpgsqlDataAdapter(String1, NpgsqlConnection1) DataTable1 = New System.Data.DataTable NpgsqlDataAdapter1.Fill(DataTable1) ' 一括の方法でもOK ' Me.ComboBox1.??? = ???? ' ぐるぐるしながらセットでもOK ' Me.ComboBox1.??? = Space(0) ' Me.ComboBox1.??? = "ミセンタク" ' Me.ComboBox1.??? = "未選択" For Each DataRow1 As DataRow In DataTable1.Rows ' Me.ComboBox1.??? = DataRow1("都道府県コード") ' Me.ComboBox1.??? = DataRow1("都道府県名(カナ)") ' Me.ComboBox1.??? = DataRow1("都道府県名") Next DataRow1 ■要件 メインの情報は都道府県名ですが、 めくった時に 都道府県コード,都道府県名(カナ),都道府県名 を見せる形で作りたいです。 都道府県コードは取り出す必要があります。 データ 1行目は空白,ミセンタク,未選択 2行目以降はtable1から取り出した値。 以上、よろしくお願いします。

  • 【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からアクセス

    お世話になります。ちょっと急ぎでお聞きしたいのですが、アクセスの、あるテーブルに新しい行を追加したくて次のように記述すると、「更新には、新しい行を含むDataRowコレクションが渡されたとき、有効なINSERT COMMANDが必要です。」とでました。 Dim rw As DataRow rw = DataSet11.Tables(1).NewRow rw.Item("年") = "2004" rw.Item("月") = "10" DataSet11.Tables(1).Rows.Add(rw) OleDbDataAdapter1.Update(DataSet11) なにか良い解決方法はあるでしょうか?  すみません、よろしくお願いします。

専門家に質問してみよう