• 締切済み

データベースのDataRowの使い方について

環境: Windows7 MicrosftVisualStudio 2013 SQLServer 2014 言語 C# .Net 通常以下のようにしてDataRowを作って使用しますが、 DataSet ds = new DataSet(); DataTable dt = new DataTable("Table1"); dt.Columns.Add("商品番号"); dt.Columns.Add("商品名"); dt.Columns.Add("価格"); ds.Tables.Add(dt); DataRow datarow = ds.Tables["Table1"].NewRow(); データソースと同じ列を使用したいので データセット  : MAINDataSet データテーブル : MASTERDataTable MAINDataSet.MASTERDataTable dtMaster = new MAINDataSet.MASTERDataTable(); として新規作成を行ったのですが、このままではレコード数が0で、上記の DataRow datarow = dataset.Tables["Table1"].NewRow(); にあたる処理 DataRow dr = MAINDataSet.MASTERDataTable.NewRow(); がわかりません。 現状では この1行の代わりに以下のようなことを毎回しなければ ならないのでしょうか? MAINDataSet.MASTERDataTable dt = new MAINDataSet.MASTERDataTable(); DataSet ds = new DataSet(); DataTable dt = new DataTable("Table1"); for(int inum = 0; inum < dt.Columns.Count; inum++) { dt.Columns.Add(dt.Columns[inum].ColumnName); } ds.Tables.Add(dt); DataRow datarow = ds.Tables["Table1"].NewRow();

みんなの回答

  • shockatz
  • ベストアンサー率80% (153/191)
回答No.2

#1です。 何か誤解なさってないですか? 説明したのは DataSet と TableAdapter による、「強い型づけ」DataTable を使うやり方です。 Entity Framework は関係ないです。 しかも、Visual Studio 2013なら、最新の Entity Framework も最初から動いてます。 インストールも不要。 そもそも、ASP.NET 4以上なら Entity Framework がデフォルトのDAOになってるはずです。 プロジェクトの bin フォルダに dll がすでに入ってないですか? 何かずいぶん昔のWebリソースをご覧になってるのと違います?

  • shockatz
  • ベストアンサー率80% (153/191)
回答No.1

Visual Studio 2013 / SQL Server 2014 をお使いなのに、データアクセス方法がVisual Studio 2003時代の方法論な理由がわかりませんが。。 本来、DataSet/DataTableというのは、データベースモデルを内部表現したもので、データの編集や変更をデータベースに自動反映させるためのもので、内部にそういう複雑な仕組みを持っています。 DBを更新するモデルなので、普通はサーバエクスプローラからDataSetペインにDragDropして自動生成してしまいます。 この概念を、VS2003のころはデータアダプタ、VS2005はテーブルアダプタというオブジェクトにまとめていました。 こういう、面倒なDataSet/DataTableを手動で作る必要はあるのですか? データ連結型のコントロールにDatSourceで連結するだけなら、DataTableなどは重いだけなのでほとんど使いません。 ていうか、最近はクラシックなDataAdapterは使わず、普通はEntityFrameworkを使います。。 どうしてもTableAdapterを使うのであれば、Datasetは不要、TableAdapterオブジェクトとDataTableオブジェクトはウィザードが生成済みなので、 var ta = new MASTERTableAdapter(); // ConnectionString内包 var dt = new MASTERDataTable(); var row = new MASTERDataTable.NewRow(); // MASTERDataTableRow型のオブジェクト=ウィザード生成済になる row.商品番号 = 1001; row.商品名 = "Visual Studio 2013 Ultimate Edition"; row.価格 = 168000; dt.Rows.Add(row); ta.Update(dt); で完了です。ウィザードで作ると、Columnも、その型も自動定義されます。気に入らなければWYSIWYG画面で変更できます。

MetalDragon
質問者

お礼

EntityFramework については全く理解できていません。 なにやらインストールしなければ動作しないようですね。 また、後日勉強したいと思います。 現状(標準)可能な範囲でやってます。

関連するQ&A

  • DataSet(DataTable)の使い方

    GridViewやListViewなどに動的にデータを追加していきたいので、 DataTableを使おうと思いました。 下記、(1)のようにPageLoadイベントで1行追加することはできたのですが、 ボタンを押すごとに、1行ずつ追加していきたいので(2)のように修正したのですが、 ボタンを押したときのポストバックで、DataSetもDataTableもnullになってしまい、 行の追加ができません。 ボタンを押すごとにどんどん行を追加していきたいのですが、このような場合は どのようにDataSetもDataTableを保持しておけば良いのでしょうか。 (1) public partial class WebForm1 : System.Web.UI.Page { int count = 0; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataSet dS = new DataSet("dS"); DataTable dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } } } (2) public partial class WebForm2 : System.Web.UI.Page { int count = 0; DataSet dS; DataTable dT; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { dS = new DataSet("dS"); dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); } } protected void Button1_Click(object sender, EventArgs e) { count = count + 1; DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } }

  • C# DataGridViewにデータを追加したい。

    C# DataGridViewにデータを追加したい。 DataGridViewにレコードを追加したいのですが、Formのロードイベントで以下コードを実行しています。 // テーブルを作成 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); DataColumn dataClumn1 = dataTable1.Columns.Add("ID", typeof(int)); DataColumn dataClumn2 = dataTable1.Columns.Add("名前", typeof(int)); // テーブルにデータを追加 dataTable1.Rows.Add(new Object[] { 1, name1}); dataTable1.Rows.Add(new Object[] { 2, name2}); dataGridView1.DataSource = dataTable1; としています。 Formにボタンを配置し、ボタンクリック時にテキストボックス[txtProName]のデータを レコード追加したいのですが、記入の仕方がわかりません。 まず、 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); をロードイベントメソッドに記入しているのも問題がありそうなのですが、 良く理解できません。 ボタンイベントでデータを挿入する方法等、記入方法のご教授よろしくお願いいたします。 当方、超初心者なので、出来れば、ソースコードもお願いいたします。m(_ _)m

  • コンボボックスに固定値をセットして表示する方法

    お世話になります。さっそくですが、質問です。 現在、VB.NET 2008で開発を行ってます。 質問の目的は、 実行プログラムにおいて、 画面に配置したコンボボックスをクリックした際、 以下の値を選択肢として表示させることです。 (【性別】の選択肢) ・男性 ・女性 Form_Load()時に、コンボボックスに上記の値を固定でセットしています。 ------------------------------------------------- Public Function getDataField1() As DataSet '変数宣言 Dim ds As DataSet Dim dt As New DataTable Dim dr As DataRow dt.Columns.Add("DataTextField", GetType(String)) dt.Columns.Add("DataValueField", GetType(String)) '空白セット dr = dt.NewRow() dr("DataTextField") = "      " dr("DataValueField") = ",,,," dt.Rows.Add(dr) dr = dt.NewRow() dr("DataTextField") = "1" dr("DataValueField") = "男性" dt.Rows.Add(dr) dr = dt.NewRow() dr("DataTextField") = "2" dr("DataValueField") = "女性" dt.Rows.Add(dr) ds = New DataSet ds.Tables.Add(dt) Return ds End Function Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ds As DataSet '性別の取得 ds = getDataField1() For i As Integer = 0 To 2 cmb_性別.Items.Add() ds.Tables(0).Rows(i).Item("DataValueField").ToString() Next i End Sub ------------------------------------------------- 上記内容の場合、コンボボックスをクリックしても 選択肢としては"空白"しか表示されません。 セットした値をコンボボックスの選択肢として表示させる方法を ご存知の方がいらっしゃいましたら、ご教授願えますでしょうか?

  • Gridに日付を入れるとき

    Gridに「2006/05/10 13:00:00」と表示させたいのですが、「2006/05/10」と表示されてしまいます。 ------------------------------------------------ Dim dt As DataTable Dim dtSet As New DataSet dt = dtSet.Tables.Add("aaa") dt.Columns.Add("日付", Type.GetType("System.DateTime")) dt.Rows.Add(New Object() {"2006/05/10 14:00:00"}) DataGrid1.DataSource = dt ------------------------------------------------ ソースが間違っているのでしょうか。どなたかアドバイスをお願いします。

  • 【ASP.NET】DataSetをSqlDataSourceに組み込めますか?

    ASP.NET Visual Studio 2005で開発を行っています。 GridViewのページングの機能を使用するには、「SqlDataSource」や「ObjectDataSource」を使用しないと有効にならないと思いますが、データベースがDataSetになっています。 この状態から、GridViewにデータをバインドし、ページングを有効にさせるには、どうしたらよいでしょうか?? SqlDataSourceにDataSetを持っていくという方法が調べても、分かりませんでした。 以下が使用しているソースです。 これですと、ページングが有効にならず、エラーになる状態です。 ============================================= Dim dSet As Data.DataSet = New Data.DataSet("データ") Dim dTbl As Data.DataTable Dim dRow As Data.DataRow dTbl = dSet.Tables.Add("データ") dTbl.Columns.Add("aaa", Type.GetType("System.String")) dRow = dTbl.NewRow() dRow("aaa") = "bbb" dTbl.Rows.Add(dRow) Me.GridView1.DataSource = dTbl Me.GridView1.DataBind() ====================================== どうぞ、宜しくお願いします。

  • カンマ区切りの文字列をDatasetに登録するには?【VB.NET2005】

    テキストファイルを読込んでカンマ区切りでDatasetに登録する際は 以下の方法で行っていました。 Dim tfp As New TextFieldParser(fileName, System.Text.Encoding.GetEncoding("Shift_JIS")) Dim dt As New DataTable Dim dr As DataRow tfp.TextFieldType = FieldType.Delimited tfp.SetDelimiters(",") While Not tfp.EndOfData dr = dt.NewRow dr.ItemArray = tfp.ReadFields dt.Rows.Add(dr) End While tfp.Close() ds.Tables.Add(dt) これをファイルではなくDim str As String = "123,aaa" という文字列に対して行いたいのですが、 上記のReadFieldsの用に使える物は無いでしょうか?

  • VB.NETからアクセス

    お世話になります。ちょっと急ぎでお聞きしたいのですが、アクセスの、あるテーブルに新しい行を追加したくて次のように記述すると、「更新には、新しい行を含むDataRowコレクションが渡されたとき、有効なINSERT COMMANDが必要です。」とでました。 Dim rw As DataRow rw = DataSet11.Tables(1).NewRow rw.Item("年") = "2004" rw.Item("月") = "10" DataSet11.Tables(1).Rows.Add(rw) OleDbDataAdapter1.Update(DataSet11) なにか良い解決方法はあるでしょうか?  すみません、よろしくお願いします。

  • DataGridViewに関して

    開発:Visual Basic 2008 考え方の質問になってしまうかもしれませんが教えて下さい。 Datagridviewを用いて、データの入力をさせたいと考えています。 但し、入力だけでなく画面にある表示ボタンを押した際には、テーブルに格納されている データを検索しに行き、その内容を表示させたいと考えています。 Datagridviewはフォームに貼り付け、各項目を一つずつ作成してあります。 しかし、この場合、以下のような記述をすると(そもそも記述が違うかと思われますが・・・)、 もともと作成してある項目(列)にデータがセットされず、新規で列を作ってしまいます。 《記述内容》 '変数の宣言 Dim dtSet As DataSet = New DataSet("PRODUCTS") Dim dtTable As DataTable 'データセットにテーブルを追加する dtTable = dtSet.Tables.Add("A_TBL") 'テーブルにフィールドを追加する '.Add("フィールド名", フィールドの型)で追加します dtTable.Columns.Add("AAA", Type.GetType("System.String")) Dim data_row As DataRow = dtTable.NewRow() data_row("AAA") = PIN_AAA dtTable.Rows.Add(data_row) 'DataGridにデータを表示する G_BBB.DataSource = dtSet.Tables(0) そもそもDatagridviewを用いて、入力や表示を行うにはどのような形にするのが 良いのでしょうか? Datasetとか使う? 教えて頂きたいと思います。 よろしくお願いします。

  • .net 複数の主キーを設定する方法

    VB2005、SQLServer2005環境です。 主キーの設定方法について教えて下さい。 主キーが一つの場合下記のように記述しますが、複数ある場合はどう記述すればよろしいですか? お願いします。 strsql = "SELECT * FROM Aテーブル" Dim comm As SqlCommand = New SqlCommand(strsql, Con) Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "Aテーブル") Dim dt As New DataTable dt = ds.Tables("Aテーブル") '主キーの設定 dt.PrimaryKey = New DataColumn() {dt.Columns("コード1")}

  • アクセスDbのテーブル項目属性の取得(VB2005)

    ご協力いただき、table名 field名までは取得できたのですが、種々プロパティを試していますが、fieldの「桁数」「タイプ」がどうしても取得できません。DAoでは .size .type だったのですが。 この部分接続など略(800文字とのことなので) Cn.Open() Dim S As String Dim tbl As DataTable Dim myRows() As DataRow tbl = Cn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"}) Dim I As Short myRows = tbl.Select() 'S = myRows(1).ItemArray(2) Dim ds As New DataSet For Each row As DataRow In myRows 'MsgBox(row.ItemArray(2)) Dim cmd As New OleDb.OleDbCommand("SELECT * From " + row.ItemArray(2), Cn) Dim dr As OleDb.OleDbDataReader = cmd.ExecuteReader Dim da As New OleDb.OleDbDataAdapter("SELECT * From " + row.ItemArray(2), Cn) da.Fill(ds, row.ItemArray(2)) For I = 0 To dr.FieldCount - 1 S = dr.GetName(I) 'Field name S = ds.Tables(0).Columns(I).ColumnName          この2行は同じものがとれます。 tables columns gettypeなど どれもうまく取得できませんでした。 よろしくご教示ください。

専門家に質問してみよう