QA@IT

SqlDataSourceにて取得した値を変数に入れるには

10111 PV

初投稿です。よろしくお願いします。

大変初歩的な質問だと思いますが、
SqlDataSourceのSELECT Commandにて取得した値を
変数に格納する方法が分からなくて困っております。
ちなみにASP.NETとC#で作成しています。

aspxファイル内では

<asp:SqlDataSource ID="TESTDataSource" runat="server"

ConnectionString="<%$ ConnectionStrings:TESTDatabaseConnectionString %>"
SelectCommand="SELECT [ID] FROM [TESTDatabase] WHERE ([ID] = @ID)" />

という定義を行っております。
このIDの値を変数に格納したいのですが。。。
どなたか教えて頂けるでしょうか。。

プログラムの勉強を始めたばかりなので
回答者様との意思疎通が上手く行えるか分かりませんが、
よろしくお願いいたします。

回答

SqlDataSource を使っているということは、GridView や DetailsView
などのデータバインドコントロールのデータソースにしているのではな
いですか。

であれば、GridView なら RowDataBound、DetailsView なら DataBound
イベントなどのタイミングで取得するのが普通です。

編集 履歴 (0)

FindControl()を使用し、RowDataBoundのタイミングで値を取得する事に成功しました。

GridViewRow.DataItem プロパティを使って DataRowView を取得できますので、それから各行/項目の値を取得するほうが簡単です。具体的な例は以下のページが参考になると思います。

GridViewRow.DataItem プロパティ
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.gridviewrow.dataitem(v=vs.100).aspx

GridView, ListView に合計表示
http://surferonwww.info/BlogEngine/post/2010/11/07/Show-sum-in-GridView-or-ListView.aspx

編集 履歴 (0)

SurferOnWwwさん
ご回答ありがとうございます。

はい、GridViewを使用しております。
FindControl()を使用し、RowDataBoundのタイミングで値を取得する事に成功しました。

ただ、DataSet(TableAdapter)でもデータを変数に入れることに成功しました。
こちらの方が簡単で分かりやすいのでSqlDataSourceではなくTableAdapterを採用する事にします。

皆様、ご回答ありがとうございました。
とても勉強になりました。

編集 履歴 (0)

winnie0621さん
質問を簡単にする為に"IDだけ"という言葉を使いましたが、
本来は複数の項目を変数に格納したいのです。

誤解を与えてしまい申し訳ありません。

編集 履歴 (0)

mocha_rx8さん、winnie0621さん
ご回答ありがとうございます。

教えて頂いたSqlDataReaderを使用して、データを取得しようとすると、DBをopen()する所で
「物理ファイル "C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\TESTDatabase.mdf" を開けません。オペレーティング システム エラー 32: "32(プロセスはファイルにアクセスできません。別のプロセスが使用中です。)"。」
というエラーが出てしまいます。

axpx1からaxpx2へページを移動する際の挙動を確認してみました。

axpx1 (SqlDataSource使用)
axpx2 (SqlDataSource使用)
⇒ エラーなし

axpx1 (SqlDataReader使用)
axpx2 (SqlDataReader使用)
⇒ エラーなし

axpx1 (SqlDataSource使用)
axpx2 (SqlDataReader使用)
⇒ 上記エラー発生

SqlDataSourceを使用している事によってDBに排他ロックがかかっているように見えます。
似たような問題を抱えている方を他の質問サイトで見かけないのですが、、これはコードの書き方が悪いのでしょうか?

ちなみにコードは以下の通りです。

string sConnectionString;
sConnectionString = GetConnectionString();
SqlConnection objConn
= new SqlConnection(sConnectionString);
objConn.Open();    // ←ここでエラー発生

編集 履歴 (0)

そのコードだと、そもそも出てくるIDは検索するときに使った@IDのパラメータと
同じってことになりませんか?
例えばこんな感じのコードを書いたとして、

<asp:SqlDataSource ID="SqlDataSource1" runat="server"
 ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
 SelectCommand="SELECT [ID] FROM [検索用テーブル] WHERE ([ID] = @ID)">
 <SelectParameters>
  <asp:ControlParameter ControlID="GV1" Name="ID" PropertyName="SelectedValue" />
 </SelectParameters>
</asp:SqlDataSource>

そもそも出てくるIDはGV1で選択したSelectedValueと同じ値しかでてきません。
それだったら、mocha_rx8さんもおっしゃるように、
わざわざASPを介さずにSQLだけで完結させたほうが簡単な気がします。

編集 履歴 (0)

以下のような方法があります。(VBでゴメンナサイ)

 Dim dv As DataView
 dv = Me.TESTDataSource.Select(New DataSourceSelectArguments)
 For Each row In dv
     hoge = row("ID")
 Next

もし変数への代入のためだけにSqlDataSourceを定義しているのなら、
コードの方でSqlDataReaderなどを作成して取得した方がスマートな気がします。

参考 http://jeanne.wankuma.com/tips/csharp/sqlserver/executereader.html

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。