C#でDataTableのカラムのデータ型を読んでみた

C#でDataAdapterのFillメソッドを使ってDataTableにデータを読み込むと、自動的にテーブルの構造を作ってくれます。とっても便利なのですが、そのDataTableからデータを取り出して計算に使おうとすると、型が不一致だと怒られることがあります。というわけで、DataTableのカラムの型を読み取ってみました。

目次

  1. 環境
  2. データ型を調べる
    1. C#のデータ型
    2. データベースのデータ型
    3. データ型の不一致
    4. DataTableのカラムの型を調べる
  3. 試してみた
  4. まとめ

環境

  • Visual Studio 2015 Express for Windows Desktop
  • PupSQLite 1.25.5.0 (SQLite 3.8.10.2)
  • System.Data.SQLite 1.0.99

データ型を調べる

C#のデータ型

C#のデータ型にはいろいろなものがあります。どういう型があるかという点については、MSDNに 組み込み型の一覧表 がありますので参照してください。

データベースのデータ型

SQLite3のデータ型は、TEXT、INTEGER、REAL、BLOB、NULLです。SQLite3にデータを入れると、これらのいずれかの型に自動的に変換されて格納されるとのことです。ただしフィールド毎に推奨する型を指定できて、それだとTEXT、NUMERIC、INTEGER、REAL、NONEの5種類になります。さらに、擬似的にDATETIMEやBOOLIANで指定できます。DATETIMEはTEXT/INTEGER/REALのいずれか、BOOLIANはINTEGERに変換されるそうです。

AccessやSQL Serverはもっといろいろなデータ型が定義されています。

データ型の不一致

例えば、DataAtapter.Fill()メソッドで作ったDataTableから整数の値を取り出してint型の変数に足そうとしたら、型が合わないと怒られたりします。というわけで、DataTableの各カラムの型がどうなっているか調べたいことがあるわけです。

DataTableのカラムの型を調べる

DataTable のColumnsプロパティを参照すると、DataTableのカラムのコレクション( DataColumn オブジェクトのコレクション)が得られます。このコレクションから調べたいカラムのDataColumnオブジェクトを取り出して、そのオブジェクトのDataTypeプロパティを見れば、そのカラムのデータ型が分ります。下記の様な感じですね。

DataColumn column = table.Columns[0];
string type = column.DataType.ToString();

試してみた

PupSQLiteでSQLite3のデータベースを作って、C#でDataTableに読み込んでカラムのデータ型を表示させてみました。

ウィンドウにTextBlockを貼って、アプリが起動すると同時にデータベースファイルを読み込んでTextBlockにデータ型を表示します。

ウィンドウレイアウトは下記の様にしました。

<Window x:Class="datatype_trial.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:datatype_trial"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="200">
    <Grid>
        <TextBlock Name="textblock" />
    </Grid>
</Window>

PupSQLiteで作ったデータベースは下図の通りです。

サンプル

一応、C#の整数と実数の型を一通りそろえたのですが、INTEGERのフィールドにulongの数値は入力できませんでした。

テーブル

C#からはSystem.Data.SQLiteを使ってデータベースアクセスしますので、NuGetでSystem.Data.SQLiteをプロジェクトに追加します。

参照追加

コードは下記の様にしました。

code-block:: csharp

using System; using System.Windows; using System.Data; using System.Data.Common;

namespace datatype_trial {

public partial class MainWindow : Window {

public MainWindow() {

InitializeComponent();

DataTable table = new DataTable(); // データ読み取り try {

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SQLite"); DbConnection connection = factory.CreateConnection(); connection.ConnectionString = "Data Source=test.db"; using (connection) {

DbCommand command = connection.CreateCommand(); command.CommandType = CommandType.Text; command.CommandText = "SELECT * FROM test"; command.Connection = connection;

DbDataAdapter adapter = factory.CreateDataAdapter(); adapter.SelectCommand = command;

adapter.Fill(table);

}

} catch (Exception ex) {

MessageBox.Show(ex.Message);

}

// フィールドのデータタイプの読み取り textblock.Text = string.Empty; foreach (DataColumn column in table.Columns) {

string name = column.ColumnName; string type = column.DataType.ToString(); textblock.Text = textblock.Text + string.Format("Field Name:{0} tType:{1}rn",name,type);

}

}

}

}

実行結果は下図の様になりました。

実行結果

INTEGERのカラムはInt64に、REALのカラムはDoubleに、DATETIMEのカラムはDateTimeに、BOOLEANのカラムはBooleanに、TEXTのカラムはStringになっています。C#では、intはSystem.Int32で、System.Int64はlongであることに注意です。

まとめ

  • DataColumn.DataTypeでDataTableのデータ型を確認できる。
  • SQLiteのINTEGERはC#のlong(Int64)である。
  • SQLiteのREALはC#のdoubleである。

広告

C#でデータ処理カテゴリの投稿