質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • VB.NET

    969questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • SQL Server

    622questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

  • ASP.NET

    562questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

DataTable型へのPrimaryKey代入時に発生するエラーについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 820

help_

score 5

現在VB.netにて開発を行っております。

ODBCConnectionを利用して接続後に利用するテーブルの
DataTable型へとColumnやDataTypeなどを取得したいです。

テーブルのカラム一覧を取得し追加したDataTable型のPrimaryKeyに
List(of DataColum)から値を代入を使用としています。

getSchema.PrimaryKey = getPrimaryKeylist(tablename).ToArray()


そこで下記エラーが発生します。

System.ArgumentException はユーザー コードによってハンドルされませんでした。
HResult=-2147024809
Message=列はテーブルに属していなければなりません。

下記コードです。

       Dim tablename as string 'Table名が入っています。
        Dim getSchema as New DataTable
        'DBの接続を行っています。接続成功したまたは接続済みの場合にTrueを返します。
        If DBConnect() Then
            'カラムの取得
            Dim sql As String
            sql = "Select  * " & _
                "From INFORMATION_SCHEMA.COLUMNS " & _
                "WHERE TABLE_NAME = '" & tablename & "' " & _
                "Order by ORDINAL_POSITION "
       'QueryExecuteは受け取ったQueryを実行して、結果をDataTableで返します。
            Dim dtshema As DataTable = QueryExecuteReader(sql)
            Dim col As DataColumn
            For Each dtrow As DataRow In dtshema.Rows
                col = New DataColumn
                col.ColumnName = dtrow("COLUMN_NAME").ToString
                Int32.TryParse(dtrow("CHARACTER_MAXIMUM_LENGTH").ToString, col.MaxLength)
                getSchema.Columns.Add(col)
            Next
         'プライマリキーの取得
            Dim getPrimaryKeylist as new List(of DataColumn)

            sql = "select COLUMN_NAME from information_schema.constraint_column_usage " & _
                 "where table_name = '" & tableName & "' and constraint_name like 'PK_%'"
             'QueryExecuteは受け取ったQueryを実行して、結果をDataTableで返します。
            Dim dtPK As DataTable = QueryExecuteReader(sql)
            For Each rowPK As DataRow In dtPK.Rows
                getPrimaryKeylist.Add(New DataColumn(rowPK("COLUMN_NAME").ToString))
            Next            ' ここでエラー発生
            getSchema.PrimaryKey = getPrimaryKeylist.ToArray()
        Else
            getSchema = Nothing
        End If


解決方法や
そもそももっとよいやり方があるなど、教えていただけませんでしょうか。

どうぞよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/02/03 19:55

    「DataTable型に取得したPrimaryKeyの入ったList(of DataColum)をtoArrayで追加」ということが具体的に何をしたいのか理解できないです。コードを見ても定義不明なメソッドなのがあって解読できません。上の「・・・」の中のことをもっともっと具体的に書いていただけませんか?

    キャンセル

回答 1

checkベストアンサー

+1

ConnectionのgetSchema()や、DataTableのFillSchema()とかを使ったほうがいいかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/03 20:06

    getSchemaからPrimaryKeyを取得する方法がわからず、上記の方法を試していました。
    もう少し調べてみようと思います。ありがとうございます。

    キャンセル

  • 2017/02/03 20:08

    FillSchema()実行するとdatatable.PrimaryKeyが設定されます。

    キャンセル

  • 2017/02/06 10:22

    DataSetもDataAdapterも利用していませんでした。
    ありがとうございました。

    キャンセル

  • 2017/02/06 10:43

    解決いたしました、ありがとうございました!

    キャンセル

同じタグがついた質問を見る

  • VB.NET

    969questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • SQL Server

    622questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

  • ASP.NET

    562questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。