SQLクエリからローカルデータベースに入力されるDataTable
がありますが、そこからデータを抽出する方法がわかりません。メインメソッド(テストプログラム内):
static void Main(string[] args)
{
const string connectionString = "server=localhost\\SQLExpress;database=master;integrated Security=SSPI;";
DataTable table = new DataTable("allPrograms");
using (var conn = new SqlConnection(connectionString))
{
Console.WriteLine("connection created successfuly");
string command = "SELECT * FROM Programs";
using (var cmd = new SqlCommand(command, conn))
{
Console.WriteLine("command created successfuly");
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
conn.Open();
Console.WriteLine("connection opened successfuly");
adapt.Fill(table);
conn.Close();
Console.WriteLine("connection closed successfuly");
}
}
Console.Read();
}
データベースにテーブルを作成するために使用したコマンド:
create table programs
(
progid int primary key identity(1,1),
name nvarchar(255),
description nvarchar(500),
iconFile nvarchar(255),
installScript nvarchar(255)
)
DataTable
から使用する意味のあるフォームにデータを抽出するにはどうすればよいですか?
DataTableには、DataRow要素の.Rows
コレクションがあります。
各DataRowはデータベースの1つの行に対応し、列のコレクションを含みます。
単一の値にアクセスするには、次のようにします。
foreach(DataRow row in YourDataTable.Rows)
{
string name = row["name"].ToString();
string description = row["description"].ToString();
string icoFileName = row["iconFile"].ToString();
string installScript = row["installScript"].ToString();
}
マーク
データテーブルを多くの要素のデータソースとして設定できます。
例えば
グリッドビュー
リピータ
データリスト
などなど
各行からデータを抽出する必要がある場合は、使用できます
table.rows[rowindex][columnindex]
または
列名がわかっている場合
table.rows[rowindex][columnname]
テーブルを反復する必要がある場合は、forループまたはforeachループを使用できます。
for ( int i = 0; i < table.rows.length; i ++ )
{
string name = table.rows[i]["columnname"].ToString();
}
foreach ( DataRow dr in table.Rows )
{
string name = dr["columnname"].ToString();
}
次のようなコードの使用を検討してください。
SqlDataReader reader = command.ExecuteReader();
int numRows = 0;
DataTable dt = new DataTable();
dt.Load(reader);
numRows = dt.Rows.Count;
string attended_type = "";
for (int index = 0; index < numRows; index++)
{
attended_type = dt.Rows[indice2]["columnname"].ToString();
}
reader.Close();
生のado.netを実行する特別な理由がない限り、nhibernateやLinq to SqlなどのORM(オブジェクトリレーショナルマッパー)の使用を検討します。そのようにすると、データベースにクエリを実行し、オブジェクトを取得して、強く型付けされ、IMHOで作業しやすくなります。
コリンG
複数のデータ型(文字列だけでなく)があるときにDataTable
からデータを抽出する最も簡単な方法は、Field<T>
アセンブリで使用可能なSystem.Data.DataSetExtensions
拡張メソッドを使用することです。
var id = row.Field<int>("ID"); // extract and parse int
var name = row.Field<string>("Name"); // extract string
MSDN から、Field<T>
メソッド:
DataRowの各列値への厳密に型指定されたアクセスを提供します。
つまり、タイプを指定すると、オブジェクトの検証とボックス化解除が行われます。
例えば:
// iterate over the rows of the datatable
foreach (var row in table.AsEnumerable()) // AsEnumerable() returns IEnumerable<DataRow>
{
var id = row.Field<int>("ID"); // int
var name = row.Field<string>("Name"); // string
var orderValue = row.Field<decimal>("OrderValue"); // decimal
var interestRate = row.Field<double>("InterestRate"); // double
var isActive = row.Field<bool>("Active"); // bool
var orderDate = row.Field<DateTime>("OrderDate"); // DateTime
}
また、null許容型もサポートしています。
DateTime? date = row.Field<DateTime?>("DateColumn");
これにより、オブジェクトを正しい型に明示的に変換または解析する必要がなくなるため、DataTable
からのデータ抽出が簡単になります。
var table = Tables[0]; //get first table from Dataset
foreach (DataRow row in table.Rows)
{
foreach (var item in row.ItemArray)
{
console.Write("Value:"+item);
}
}
DataAdapterを使用する場合、接続を開いたり閉じたりする必要がないことに注意してください。
したがって、このコードを更新し、接続のオープンとクローズを削除することをお勧めします。
SqlDataAdapter adapt = new SqlDataAdapter(cmd);
conn.Open(); //このコード行は不要です
Console.WriteLine("connection opened successfuly");
adapt.Fill(table);
conn.Close(); //このコード行は不要です
Console.WriteLine("connection closed successfuly");
この例に示されているコードは、Connectionを明示的に開いたり閉じたりしません。 Fillメソッドは、接続がまだ開いていないことを検出した場合、DataAdapterが使用している接続を暗黙的に開きます。 Fillが接続を開いた場合、Fillが終了すると接続も閉じます。これにより、FillやUpdateなどの単一の操作を処理するときにコードを簡素化できます。ただし、オープン接続を必要とする複数の操作を実行している場合は、ConnectionのOpenメソッドを明示的に呼び出し、データソースに対して操作を実行してから、ConnectionのCloseメソッドを呼び出すことにより、アプリケーションのパフォーマンスを向上させることができます。他のクライアントアプリケーションが使用できるようにリソースを解放するには、データソースへの接続をできるだけ短時間開いておく必要があります。