web-dev-qa-db-ja.com

DataTableからデータを抽出するにはどうすればよいですか?

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から使用する意味のあるフォームにデータを抽出するにはどうすればよいですか?

63
RCIX

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();
 }

マーク

140
marc_s

データテーブルを多くの要素のデータソースとして設定できます。

例えば

グリッドビュー

リピータ

データリスト

などなど

各行からデータを抽出する必要がある場合は、使用できます

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();
}
21
rahul

次のようなコードの使用を検討してください。

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();
4
salimido

生のado.netを実行する特別な理由がない限り、nhibernateやLinq to SqlなどのORM(オブジェクトリレーショナルマッパー)の使用を検討します。そのようにすると、データベースにクエリを実行し、オブジェクトを取得して、強く型付けされ、IMHOで作業しやすくなります。

コリンG

3
pythonandchips

複数のデータ型(文字列だけでなく)があるときに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からのデータ抽出が簡単になります。

2
haldo
  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);
         }
     }
0

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メソッドを呼び出すことにより、アプリケーションのパフォーマンスを向上させることができます。他のクライアントアプリケーションが使用できるようにリソースを解放するには、データソースへの接続をできるだけ短時間開いておく必要があります。

0
Rick