• 締切済み

DataSetのFillで詰まる

VB(VS2005)でDB(MySQL)のクライアントソフトを作っています。 DBからデータを取得する際、DatasetでFillをしてるんですが、数あるクライアントの中でも、マシンによってはそのFillですごい時間がかかる事があります。SQLでSelectして返ってくるデータは、たった数行のデータです。なのにFillに20秒とかかかり、しかも、さらに困るのは、1台のマシンがFillで詰まってると、他の全てのマシンからDBへのデータ要求もストップして大渋滞が起こってしまうんです。MySQLって、一つの要求が完了するまで他の要求は待たせるんですか?? そして、そもそも、たった数行のデータをFillするのになんで20秒もかかるんですか?(ちなみに、その同じマシンでも、普段は0.5秒もかからずFillします。何度か、Fillを繰り返していると、周期的に(10回に1回くらい)極端にFillに時間がかかるようになります。デバッグで、ステップで送りながら見ていくと明らかに、datatable.fillの部分で、20秒ほど止まります。) レベルの低い質問で申し訳ありませんが、今、現場では、この現象がすごいうっとおしいんです。早く解決したいんですが、どうしたらいいでしょうか?ちなみに、遅いマシンとはいっても、2年前に買ったXPで、スペックも標準的なマシンです。抽象的な説明で申し訳ありませんが、どなたか教えて下さい。お願いします。

  • mshs
  • お礼率76% (29/38)

みんなの回答

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

Myssql は使用したことがないのでなんとも・・・ ですが どのような方式で データのやり取りを実装しているのか不明なのでなんともいえません。 VB.NET 2005 は以前使っていた OleDataAdpter は隠れてしまっていているのでもしやと・・・ VB.NET 2005 では新しく TableAdpter クラスが追加されました。 TableAdpter は ウイザードで簡単にデータセットを作成してくれたり クエリーを作ったりといたれりつくせり状態ですが どうも小回りが利かなくて私は好きではないです。 前の方も書いているとおり。 SqlSERVER へクエリを投げた結果を取得する方法としては ストアドを VB.net 2005 側から起動する。 ストアドの場合は 結果はパラメータで受け取るか クエリ結果を 1行づつ、SqlcommandのRederクラスで受け取りDataTableにコピーする。もしくはDataSet に書き込む。 ストアドは 参考があります。 http://blogs.wankuma.com/naka/archive/2005/10/22/18773.aspx ほかクエリーを文字列で渡す方法もありますが、まずはストアドで試してみて、結果がよければストアドでやってみる。 もしだめなら、クエリをSqlcommand で発行する。 Select or update など。 これらの操作を簡素化するために OleDataAdpter もあります。 一回、クエリの最適化、プログラムの見直し(最適化)をされるように して見てください。 あと、どんなシステムなのかは不明です クライアント・サーバー型 なのでしょうか?? どうしてもマシンスペックが追いつかないならメモリーの増設、 買い替え もしくはターミナルサーバーでアプリケーションサーバーを仕立てるなど検討するのも一案です。 まずは問題点が明確になるようテストプログラムで検査する必要があるようにおもえます。 最悪 Mysql から SQLSERVER 2005 へ乗り換えも必要かも・・・

mshs
質問者

お礼

ありがとうございました。 自己解決です。MySQLサーバーの名前解決の問題でした。

  • tomo316
  • ベストアンサー率35% (51/142)
回答No.1

参考までに。 http://www.microsoft.com/japan/msdn/enterprise/pag/scalenetchapt12.aspx ここによると、DataReaderのほうがDataSetより高速だと書いています。 単純な検索なら、DataReaderで十分だと思います。

mshs
質問者

お礼

ありがとうございました。 自己解決です。MySQLサーバーの名前解決の問題でした。

関連するQ&A

  • Datasetの非接続(C#)※初心者

    C#でプログラム開発をしています。 Accessのデータをお客様に配布したくないため、メモリ上にDataSetで取り込めばよいと上司から言われました。 そこでお聞きしたいのですが、下記のようにDataSetでAccessからデータを取り込み、メモリ上に保持はできたのですが、これをデータ接続せずに、再びデータを参照することはできるのでしょうか? // データ元のmdbファイル DataTable dataTable1; DataSet dataSet1 = new DataSet(); OleDbDataAdapter dataAdapter1 = new OleDbDataAdapter( "SQL文", "mdbファイルのパス" ); // データ取得 dataAdapter1.Fill( dataSet1 ); dataTable1 = dataSet1.Tables[0]; お手数ですが、どうか教えてください。

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

  • VB2005のデータテーブルFillについて

    いつもお世話になります。 VB2005で開発しています。素朴な疑問なんですが、 Form1にデータソースウィンドウからデータテーブルをドラッグしてはりつけると、 'TODO: このコード行はデータを 'DataSet1.test' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 Me.testTableAdapter.Fill(Me.DataSet1.test) と、自動でコードが生成されますが、「Me.」って必ずいるのでしょうか? 参考書を見てみると、データを呼び込むコードが testTableAdapter.Fill(DataSet1.test) となっており、「Me.」がありませんでした。 自動で生成されたコードの「Me.」を削除して使うと何か支障があるのでしょうか?

  • c#によるdatasetからdatagridviewの操作

    C#を始めたばかりの初心者です。 今いろいろ最初からボタンをセットしたり徐々に進んでいるのですが、今datasetとdatagridviewの場所でつまずいています。 デザイン上でデータセットをセットしdatatableテーブル名(abc)をつけcolumnにa,b,c,d,eと5つ列を追加しました。 そしてdatagridviewを制作しデータソースの選択で上記で作ったdatasetを割り当てました。 そのあとが質問なのですが、datasetにa,b,c,d,eにデータをtextboxから5個入力し。datasetに追加できたら次々とdatagridviewに表示させていき、ある程度までたまったら選択した行のeを更新してみたいのですが。 インターネットを探しているとmdbなどアクセスなどとつなげてるのが多かったのですが、アクセスなどのソフトとつなげないとこの内容は無理だったりするのでしょうか。 Visual C#2005逆引き大全で勉強しているのですがもしよければプログラミング方法など教えていただけたら幸いです。

  • C#での記述方法に関して

    C#での記述方法に関して 簡単な質問で申し訳ありません。 以下のVBで記述されたソースをC#で同じ内容で記述したいのですが、 どのように記述すれば良いでしょうか・・・。 《内容》 Dim ta As New DataSet1TableAdapters.DataTable1TableAdapter() ta.Fill(DataSet11.DataTable1) 教えて下さい。

  • データテーブルの使い方に関して

    MySQLからデータを取得し、その情報を加工した後、データセットへ格納したいと考えています。 単純にMySQLから直接データをデータセット等へ格納する方法は、FILL等を使えば 実現できましたが、1件1件加工しながらセットする方法がわかりません。。。 ※ 加工しながらというよりは、加工した後の結果データ 今現在、以下のようにデータセットとデータテーブルを作成しましたが、どのように データを追加すれば良いのでしょうか??? 《記述内容》   DataSet myds = new DataSet();   DataTable mytable = myds.Tables.Add("MyTable"); それに関連して教えて頂きたいのが、上記のようにデータテーブルをデータセット内に 作成しましたが、データテーブルというのは、そもそもテーブルの中に項目?フィールド?を作成しないと データというのは格納できないのでしょうか。。。 初歩的な質問で申し訳ありませんが、教えて頂きたいと思います。

  • C#でのデータセットを使用したDBアクセス

    はじめまして。 データセットを使用したDBアクセスの実装では SqlDataAdapter da = new SqlDataAdapter(strsql,stConnectionString); DataSet ds = new DataSet();  …(1) da.Fill(ds);              …(2) としますが(1)と(2)を合わせて DataSet ds = da.Fill(); とはできません。 インスタンス作成の際はオブジェクトによっては「=」でつないで作成するのがあると 思いますが、データセット使用の際にはできないのは、使用するオブジェクトによって 定義の記述が違うという認識を持っておけば良いのでしょうか? 「=」を使用せず、da.Fill(ds)で記述することに違和感があります。 よろしくお願いします。

  • バグがとけません・・・

    現在私はVB2005で4択のクイズ形式のプログラムを作成しています。 データセットに問題、解答群などを格納しています。 それをフォームで表示してラジオボタンで4択のなかから正解と思うものを1つ選びボタンをクリックして次の問題へ移行する・・・というような流れのプログラムです。 今ためにしに問題を十問出題し最後の問題を終えたら10問中何問正解したかを表示するプログラムを作成しています。 データセットの内容はそれぞれ下記のとおりです。 Answer1~4・・・選択肢1~4 SelectAnswer・・・選択した選択肢を格納する CorrectAnswer・・・予めデータセットに格納してある正解 Loadで最初の一問目だけを読み込んで後はボタンを押すごとに問題が進んでいきますが全問正解するようにしても結果表示が正しく表示されません。 どこがバグかわかる方、もしくはさらに効率のいいコードがわかる方がいましたら助けてください。どうかよろしくお願いしますm(_ _)m Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If IO.File.Exists(filePath) Then DataSet1.ReadXml(filePath) End If Question.Text = DataSet1.DataTable1(i).Question Answer1.Text = DataSet1.DataTable1(i).Answer1 Answer2.Text = DataSet1.DataTable1(i).Answer2 Answer3.Text = DataSet1.DataTable1(i).Answer3 Answer4.Text = DataSet1.DataTable1(i).Answer4 '正誤確認 If Answer1.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ア" ElseIf Answer2.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "イ" ElseIf Answer3.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ウ" ElseIf Answer4.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "エ" End If If DataSet1.DataTable1(i).SelectAnswer = DataSet1.DataTable1(i).CorrectAnswer Then total = total + 1 End If i = i + 1 End Sub Private Sub NextQuestion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextQuestion.Click 'Static i As Integer = 0 'UStatic total As Integer = 0 'MsgBox(i)デバッグ '問題の読み込み Question.Text = DataSet1.DataTable1(i).Question Answer1.Text = DataSet1.DataTable1(i).Answer1 Answer2.Text = DataSet1.DataTable1(i).Answer2 Answer3.Text = DataSet1.DataTable1(i).Answer3 Answer4.Text = DataSet1.DataTable1(i).Answer4 '正誤確認 If Answer1.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ア" ElseIf Answer2.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "イ" ElseIf Answer3.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ウ" ElseIf Answer4.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "エ" End If If DataSet1.DataTable1(i).SelectAnswer = DataSet1.DataTable1(i).CorrectAnswer Then total = total + 1 End If '終了 If i = 10 Then MsgBox("あなたの正解数はは10門中" & total & "問です!") Me.Close() End If i = i + 1 Answer1.Checked = True End Sub

  • DataSetの更新時のエラーについて。

    VB.NETです。 SqlDataAdapterからDataSetを生成して使用しています。 DataGridに表示させて、選択したレコードを削除させるようにしています。 そのとき、DataGrid上からは削除されるのですが、(DBは未更新) 更新ボタンを押したときに更新させていますが、このときにエラーが発生します。↓ 'System.InvalidOperationException' のハンドルされていない例外が system.data.dll で発生しました。 追加情報 : 更新には、削除された行を含む DataRow コレクションが渡されたとき、有効な DeleteCommand が必要です。 他のページでも同じ処理でうまく動いているのでここだけうまく動かないという理由がわかりません。 更新ボタンのところの処理は SqlDataAdapter12.Update(Ds12, "T製品") DataGrid1.Update() だけなのですが、なにが足りないでしょうか? 追加のときはなんら問題ないのですが・・・。

  • DataTableにデータを用意した後DBに反映する方法

    VB2008 SQLServer2008で開発しています。 DBにデータを追加したいと思っています。 DataTableを作成しているので これを使って簡単にDBにデータを追加することは できないでしょうか? そのやり方の場合 insert文を1行ずつ実行するのと処理時間に差はあるのでしょうか?

専門家に質問してみよう