C#でDataTableのカラムのデータ型を読んでみた
C#でDataAdapterのFillメソッドを使ってDataTableにデータを読み込むと、自動的にテーブルの構造を作ってくれます。とっても便利なのですが、そのDataTableからデータを取り出して計算に使おうとすると、型が不一致だと怒られることがあります。というわけで、DataTableのカラムの型を読み取ってみました。
目次
環境
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#でデータ処理カテゴリの投稿
- C#でDataAdapterを使ってAccessのデータベースを読み書きしてみた
- C#でDataAdapterを使ってAccessのデータベースを読み書きしてみた(OleDb編)
- C#でDataGridに表示するデータを操作してみた
- C#でDataTableのカラムのデータ型を読んでみた
- C#でDataTableの自動インクリメントをしてみた
- C#でJSON形式のデータを出力してみた
- C#でLinq to objectの結果をDataTableにしてみた
- C#でSQLite3のデータベースを使ってみる(ADO.NET ファクトリーデザインパターン)
- C#でSQLiteを使ってみる(インストール)
- C#でコレクションの要素の数を調べる
- C#でコレクションを内部結合してみた
- C#でコレクションを左外部結合してみた
- C#でコレクションを昇順または降順に並び替える
- C#で渡された配列を加工して配列で返す関数について注意すること
- C#のキューを試してみた
- C#のスタックを試してみた