WEBアプリでデータを書き込む

このQ&Aのポイント
  • visual web developerを使用してwebアプリケーションを作っています。住所氏名一覧表に、あらたに住所氏名を加えていく入力フォームを作成しています。
  • すべてのデータにIDを自動出来に加えたいのですが元データをXMLファイルにすると自動でIDをふる方法がわかりません。
  • 元データをACCESSファイルにするとデータの「登録」ボタンを押した際”別のプロセスで使用されているため、プロセスはファイル××にアクセスできません。”と出てしまいます。
回答を見る
  • ベストアンサー

WEBアプリでデータを書き込む

visual web developerを使用してwebアプリケーションを作っています。 住所氏名一覧表に、 あらたに住所氏名を加えていく入力フォームを作成しています。 すべてのデータにIDを自動出来に加えたいのですが 元データをXMLファイルにすると 自動でIDをふる方法がわかりません。 元データをACCESSファイルにすると データの「登録」ボタンを押した際 ”別のプロセスで使用されているため、プロセスはファイル××にアクセスできません。” と出てしまいます。 できれば後者の方法(ACCESS形式)で運用したいのですが のどようにすればいいのでしょうか? 教えてください! 以下は「登録」ボタンのコードです。 Protected Sub Button_Add_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button_Add.Click ' データベースファイルのパスを定義する Dim UpFolder_URL As String = "~/Chap4/Upload_data/" Dim UpFolder As String = Server.MapPath(UpFolder_URL) Dim DBFile As String = UpFolder + "database.mdb" ' データベースのデータを読み込む Dim albumDS As New Data.DataSet() albumDS.ReadXml(DBFile) Dim table As Data.DataTable = albumDS.Tables("item") ' 新しい行をテーブルに追加する Dim newRow As Data.DataRow = Table.NewRow() newRow("Date") = DateTime.Today.ToLongDateString() newRow("Name") = Name.Text newRow("Contents") = Contents.Text newRow("Add") = Add.Text newRow("Method") = Method.Text table.Rows.Add(newRow) ' データをデータベースファイルに書き出す albumDS.WriteXml(DBFile) ' GridViewの表示を更新する GridView1.DataBind() End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • aspnet
  • ベストアンサー率79% (72/91)
回答No.1

WebアプリでACCESS MDBというのもアレですが、まあ手近に使えて、一般の方でもデータ操作が簡単ということで。 .NETのデータハンドリングについては、進化の歴史みたいなものがあって、新しいものから順番にざっと ■Entity Framework(VS2008 SP2/VS2010) ■LINQ(VS2008 SP2) ■DataSourceコントロール(VS2008) ■TableAdapter(VS2005 ADO.NET2.0) ■DataAdapter(VS2003 ADO.NET1.1) ■SQLConnection/SQLCommand とあるんですが()、新しいもの2つはMDB未対応です。このころ、組込用途のSQLサーバが出たのでMDBはオワコンになりました。 DataADapter以降であればウィザード画面も用意してあり、非常に簡単に接続や定義が行えるようになっています。 コードを拝見したところ、DataTableをお使いのようなので、「慣れ」からいえばTableAdapterを使うのがベストマッチかと思います。 TableAdapterというのは、MDBへの接続情報、基本クエリ(追加・削除・更新)およびユーザが利用する各種の独自クエリ、およびそれによって生成されるDataTableをまとめたもので、テーブルやビューごとに作成でき、また制約なども定義できるという便利なものです。 こいつでTableアダプタクラスを作り、そのオブジェクトに作成しておいたクエリを打てば、当該のDataTableが返るので、あとは普通にプログラムします。 追加や更新の場合は、DataTableのオブジェクトをTableAdapterに渡してUpdateすれば、自動的にに判断されて処理されます。 ウィザード系の操作は、書籍やWebにリソースがありますので、以下の言葉でググってみてください。 TableAdapter ADO.NET2.0 DataSet DataTable 型付きデータセット DataAdapterはVS2005時代のものなので、できればSQLDataBase CompactとEntity Frameworkを使った方がいいと思うのですが。。

masunona
質問者

お礼

ご回答ありがとうございます! Aceess愛好者で多くの社内システムをAccessで作っていたので 思わずデータベースをmdbファイルにしてしまいました・・・。 いつかは行き詰まってしまいそうだと 薄々思ってはいたのですが・・・。 TableAdapter見てみます! ありがとうございました!

その他の回答 (1)

  • onos
  • ベストアンサー率81% (127/155)
回答No.2

mdbファイルはデータベースファイルですから、ODBCとかで接続して読みだす必要があります。 XMLファイルのようにテキストファイルを読み込むのとは違った手順が必要です。 そのあたりきちんと学習すれば、すくなくとも「別プロセスで~」なんてエラーはでなくなります。 このプログラムはXMLファイルならそれなりに動いてるんですかね? であれば、データを追加する前に、読み込んだデータの中のIDの最大値をまず取得してそれに1足したIDをあたらしいデータにあたえればいいだけの話のような気がします。 ただし、Webアプリは複数の人が同時に操作することを前提に考えないといけないので、ほぼ同時にデータの追加が行われても同じIDが追加されたりしないように工夫する必要があります。 Application変数をうまく使ってロックかけたりするとか。 ま、本来的にはSQLサーバーのようなデータベースをきちんと使うほうがよいと思います。 そのほうが参考になる資料等も多くでてますしね。

masunona
質問者

お礼

ご回答ありがとうございます! XMLファイルではそれなりに動いているのですが IDを自動的にふる方法が分からず mdbに逃げ込みました。 データベース形式としては XMLファイルのほうがいいんだろうなと思いながらも。。。 SQLサーバーを利用したいとは思ってるのですが まだそこまで手が届いていません。。。 (つたない知識で勉強しては挫折を繰り返しています。) >データを追加する前に、読み込んだデータの中のIDの最大値をまず取得してそれに1足したIDをあたらしいデータにあたえればいいだけの話のような気がします。 上記方法試してみたいと思います! そう大人数で頻繁に使うものではないので 対応できそうです! ありがとうございました!!

関連するQ&A

  • GridView1の選択の指定とダミーデータの追加について

    GridView1とTwxtBox1を用意し GridView1に選択ボタンをつけ押すと、TextBox1にその行の1行目を表示するようにしたいのですが ★に何を入れたら、選択行を指定することができるのでしょうか?教えてください。 Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) TextBox1.Text = GridView1.Rows.Item(★).Cells(1).Text End Sub Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString Dim strSQL As String strSQL = "SELECT 1CELL FROM tableA" Using con As New SqlConnection(conStr) Using cmd As NEw SqlCommand(strSQL, con) Dim dr As SqlDataReader con.Open() dr = cmd.ExecuteReader(Data.CommandBehavior.CloseConnection) GridView1.DataSource = dr GridView1.DataBind() dr.Close() End Using End Using End Sub また、GridView1に出ているデータに選択するデータがない場合の為に データーベースにはなくても【-】というデータを常に表示できるようにしたいのですが どのようにしたらいいのでしょうか? 【tableAの1CELL】 AAAAA BBBBB CCCCC DDDDD - ←データベースにはこのデータはないけれどGridView1には常に表示し、これを選択するとTextBox1に【-】が入るようにしたいのですが よろしくお願いします。

  • .NETのGridViewでテストデータの投入方法

    Microsoft Visual Studio 2008を使用しています。 ASP.NETのGridViewで、データソースを使用せずにテストデータを投入する方法を教えて下さい。 情けないくらいの初心者です。どうか助けてください。 表示だけを確認して画面整形したいので、データ部に『12345』などのテストデータを投入して表示させたいのですが、そのやり方が分かりません。 GridView自体の設置と、列の追加までは出来ています。が、肝心のデータを入れられないためにプレビューしても真っ白になってしまいます。 検索して調べた結果、ダミーのデータテーブルを作成してバインドする方法があったのですが、それをどこに書けばいいのか、また、関数名??をどうしたらいいのかが分かりません。 失礼ながら拾ったソースをそのまま拝借すると… DataTable table = new DataTable(); table.Columns.Add("data1"); table.Columns.Add("data2"); DataRow row1= table.NewRow(); row1["data1"] = "value1-1"; row1["data2"] = "value1-2"; table.Rows.Add(row1); DataRow row2 = table.NewRow(); row2["data1"] = "value2-1"; row2["data2"] = "value2-2"; table.Rows.Add(row2); GridView1.DataSource = table; GridView1.DataBind(); これを、vbの方に記述すればいいのでしょうか? また、function名といいますか、sub名?をどうしたらいいのかがわかりません。。 デザイン画面上でダブルクリックして自動生成されるソースだと Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.SelectedIndexChanged End Sub になるので、ちょっと違う気がします・・。 上の拝借したソースよりも、もう少し分かりやすく記述していただけると大変嬉しいです・・。 本当に本当に初心者で申し訳ありません!!! とても困っているので、どうか助けてください、宜しくお願い致します!

  • 【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() ====================================== どうぞ、宜しくお願いします。

  • VB.NETでのデータベース書き込みについて

    リストレビューに表示されているデータをデータベースに書き込む処理を追加したいのですが、データセットにメモリ上のテーブルを作成してデータベースへ書き込む方が良いのでしょうか? それとも直接データベースに書き込む方が良いのでしょうか? 前者のテーブル作成のコードは書きの通りです。 Public Function AddDataSetTable(ByVal kojo_cd() As String, ByVal kojo_name() As String, ByVal kojo_date() As String)   Dim dtSet As New DataSet("DataSetTable")   Dim dtTable As New DataTable("CalDatTable")   Dim fmain As New FrmMain   Dim i As Integer   'テーブルに列を追加    With dtTable.Columns     .Add("コード")     .Add("名称")     .Add("日にち")    End With   'テーブルに行を追加   With dtTable.Rows    For i = 0 To UBound(kojo_cd)     .Add(New Object() {kojo_cd(i), kojo_name(i), kojo_date(i)})    Next i   End With   'データセットにテーブルを追加   dtSet.Tables.Add(dtTable) End Function

  • vb.net web 動的に作成したTableが消える

    よろしくお願いします 現在、vs.net 2005 で web ページを作成しています そこで質問があるので、ご教授の程よろしくお願いします。 test.aspx Table コントロール配置:Table1 Button コントロール配置:Button1 Label コントロール配置:Label1 Label コントロール配置:Label2 test.aspx.vb Partial Class test Inherits System.Web.UI.Page Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load Dim row As TableRow Dim col As TableCell If (Page.IsPostBack = False) Then Label2.Text = "aaa" row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) row = New TableRow col = New TableCell : col.Text = "行0:列0" : row.Cells.Add(col) : col = Nothing col = New TableCell : col.Text = "行0:列1" : row.Cells.Add(col) : col = Nothing Table1.Rows.Add(row) End If End Sub Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = "Rows.Count" & Table1.Rows.Count End Sub End Class ボタンを押すと、 Label2の "aaa" は保持されていて Table1が保持されないのはなぜなのでしょうか? Table1 の内容を保持させたいのですが その場合、どのようにすればよいのでしょうか

  • VB.NET、mdbに新しいデータを追加したい

    超初心者で申し訳ありません。下のプログラムにおいてオペレータ名が一致する場合には 更新(UPDATE)する。一致するデータが無い場合には新規登録を行いたいのですが どのように書いたらいいのかさっぱりでNETを相当探したのですが回答が見つかりません。 お手数ですがどなたか助けていただけませんでしょうか。なお、一致する場合には 更新(UPDATE)は動作するようになりました。 VBを始めて2ケ月になります。Microsoftの文献を見ても難しくてまだ理解できるレベルに達していません。どなたか、よろしくお願い致します。 「データ構造」 ID          integer オペレータ名   string ランク       integer パスワード    string 補足       string Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '■■■■■■■■■■■■■■■■■■■■■■■■ '■■■   オペレータの新規/更新登録   ■■■  '■■■■■■■■■■■■■■■■■■■■■■■■ '----------------------------------------------------------- 'コネクションを作成 Dim CurrentDir As String = System.IO.Directory.GetCurrentDirectory() Dim cn As New OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & CurrentDir & "\operator.mdb" '**************** コマンドを作成 **************** Dim OPE As String Dim PWORD As String Dim HOSOKU As String Dim RANK As Integer OPE = オペレータ名.Text RANK = ランク.Text HOSOKU = 補足.Text PWORD = パスワード.Text Dim cmd As New OleDbCommand( "UPDATE table1 " & "SET ランク = ? " & "," & "パスワード = ? " & "," & "補足 = ? " & " WHERE オペレータ名 = ? ", cn) '************** パラメータを作成 **************** cmd.Parameters.Add("ランク", OleDbType.Integer).Value = RANK cmd.Parameters.Add("パスワード", OleDbType.Char).Value = PWORD cmd.Parameters.Add("補足", OleDbType.Char).Value = HOSOKU cmd.Parameters.Add("オペレータ名", OleDbType.Char).Value = OPE '実行 cn.Open() cmd.ExecuteNonQuery() '-------------------------- Dim COUNTC As Integer COUNTC = cmd.ExecuteNonQuery()   '************************************ elseの中に簡単に記載すのって難???*** If COUNTC > 0 Then MessageBox.Show("更新 完了")     Else 'INSERTの手順       ’★ ここにmdbの中に 項目値 OPE、RANK、HOSOKU、PWORDを挿入(追加)        する命令を入れたい。   '実行 cmd.ExecuteNonQuery() End If ’********************************** '-------------------------- cn.Close() End Sub

  • データを判別してのテーブル処理

    データの内容を比較して、すでにあるデータ(キーで判別)は書き換え、ない場合はレコードの追加処理をしたいと思います。 Me.PASSTableAdapter.Fill(Me.YOSAN_SYSDataSet.PASS) Dim UserData As YOSAN_SYSDataSet.PASSRow Dim newRow As DataRow = YOSAN_SYSDataSet.PASS.NewRow Do UserData = Me.YOSAN_SYSDataSet.PASS.FindByID(LogonUser(0, LogCount).Text) If UserData.Table.Rows.Count <> 0 Then <==ココで落ちる   UserData.PASS = LogonUser(1, LogCount).Text   UserData.NAME = LogonUser(2, LogCount).Text Else newRow(0) = LogonUser(0, LogCount).Text newRow(1) = LogonUser(1, LogCount).Text newRow(2) = LogonUser(2, LogCount).Text YOSAN_SYSDataSet.PASS.Rows.Add(newRow) End If Me.PASSTableAdapter.Update(Me.YOSAN_SYSDataSet.PASS) LogCount += 1 Loop While LogonUser(0, LogCount).Text <> ""  上記の命令ですと、すでにあるデータ(更新)処理はうまくいくのですが、新規データの場合矢印の場所で「オブジェクト参照がオブジェクトインスタンスに設定されておりません」とエラーになってしまいます。  どうしたらよろしいでしょうか?

  • VB.netでパスワード変更

    下記のようなパスワードを変更するフォームをVB.netで作成したのですが、 実行すると、いつも異なるretValの値がかえってきて変更できません。 retValの値もよくわからない大きな数値がかえってくるのでどのようなエラーかも 判断つかず。 どこが間違っているかお分かりになる方いらっしゃいますでしょうか。 Public Class Form1 Private Declare Function NetUserChangePassword Lib "netapi32.dll" (ByVal Domain As String, ByVal User As String, ByVal OldPass As String, ByVal NewPass As String) As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim retVal As Long Dim sDomain As String Dim sUser As String Dim sOldPass As String Dim sNewPass As String sDomain = "xxxxxxx" ←ここはサーバのIPアドレス sUser = TextBox1.Text sOldPass = TextBox2.Text sNewPass = TextBox3.Text retVal = NetUserChangePassword(sDomain, sUser, sOldPass, sNewPass) MsgBox(retVal) End Sub End Class

  • VBでSQL文のUPDATE構文を使った時のエラーについて

    こんにちは。全くのVB初心者ですが回答、ご指摘のほうよろしければお願いします。 Microsoft Visual Studio 2005でデータベース管理のアプリケーションを制作しているんですが、エラーが出て困っています。 本フォームの各Textboxの編集した値を、 利用者カルテフォーム(別フォーム)のDataGridViewとデータベースに反映させるというプログラミングにしようとしています。 以下のコードでデバッグしようとしても「UPDATE ステートメントの構文エラーです。」というエラーメッセージが出てきて実行できない状態です。 VB中学校というサイトのデータベース講座を参考にしました。 ------------------------------------------------------------ Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:xxxx.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Table As DataTable = DirectCast(利用者カルテDataGridView1.DataSource, DataTable) Dim Row As DataRow Dim Adapter As New OleDbDataAdapter(SQLCm) Row = Table.NewRow Row("No") = NotextBox.Text Row("名前") = 名前TextBox.Text Row("フリガナ") = フリガナTextBox.Text Table.Rows.Add(Row) Dim SQL As String = "" SQL = "UPDATE 患者データ SET " SQL &= " No = " & Row("No") & "', " SQL &= " 名前 = '" & Row("名前") & "', " SQL &= " フリガナ= " & Row("フリガナ") & "', " SQL &= " WHERE " SQL &= " No = " & NotextBox.Text SQLCm.CommandText = SQL Cn.Open() ※SQLCm.ExecuteNonQuery() Cn.Close() 利用者カルテ.Show() Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Sub ---------------------------------------------------------- 以上が実際にエラーがでる部分になります。 ※の部分で「UPDATE ステートメントの構文エラーです。」というエラーが指摘されています。 ちなみに他のフォームでINSERT文も使っているのですが、そちらは問題なく実行できる状態です。 初歩的な質問で申し訳ないですが、よければ回答のほうよろしくお願いします。

  • ボタンの検知

    すみません。初心者です。教えてください。 フォームにボタン1個、テキストボックス1個のプログラムです。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim chr As String Dim chr2 As String chr = "■" chr2 = Label1.Text Label1.Text = chr2 & chr End Sub このプログラムで ・ボタンを「押すたび」に"■"→"■■"→"■■■"と増えていきます。 これを ・ボタンを「押しままにすると」"■"→"■■"→"■■■"と増えていくようにするにはどうしたらよいでしょうか? 例えばタイマー使って100ms毎とかで"■"の数を増やしたいと思っていますが、「ボタンを押している」ということをどのように拾ったらいいか考えてもわかりません。 どなたかすみませんが教えてください。

専門家に質問してみよう