- PR -

データの取得方法

投稿者投稿内容
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-02 11:23
//環境
言語:Microsoft Visual Studio 2008
データベース:SQL Server 2005 接続型のデータアクセス
//質問
現在,上記環境で開発を始めたところです。
そこで簡単なプログラムを取りかかったのですがすぐにつまずいてしまいました。
やりたいことは、テーブルから特定の条件のデータを取得したいのですが、
私なりに勉強してきたコーディングと、他の人とのコーディング方法が違います。
まず、私のやり方は、データベースに接続するところから始めるのですが、
他の人のやり方は、アプリケーションのプロパティの設定で既に、接続文字列を
登録済みのため、データベースのオープン処理をしないというやり方です。
その為、データベースのオープン処理をしない場合、下記のConところをどうしたらいいのか分からなくなりました。
どなたかアドバイスをいただければと思います。

<自分のコーディング>
' データベースオープン
Public Con As System.Data.SqlClient.SqlConnection
Con = New System.Data.SqlClient.SqlConnection()
Con.ConnectionString = "Data Source=192.168.xx.xxx;Initial Catalog=TestDB;User ID=sa;Password=sa
Con.Open()
' データ抽出
strsql = "SELECT CD, NAME FROM xxx WHERE (CD = '001')"
Dim command As New SqlClient.SqlCommand
command.Connection = Con ←データベースオープン処理がない場合、ここのconをどう記述すればいいでしょうか?
command.CommandType = CommandType.Text
command.CommandText = strsql
Dim sr As SqlClient.SqlDataReader
sr = command.ExecuteReader()
command.Dispose()
If Not sr.HasRows Then
Else
While sr.Read
TXT_NAME.Text = sr("NAME").ToString()
End While
End If
sr.Close()

<他の人のコーディング>これでデータベースをオープンしなくてもデータの読み込みができます。
Using tAdpter As MyAppDataSetTableAdapters.xxxTableAdapter _
= New MyAppDataSetTableAdapters.xxxTableAdapter, _
hAdpter As Data.SqlClient.SqlDataAdapter _
= New Data.SqlClient.SqlDataAdapter(), _
wTBL As MyAppDataSet.xxxDataTable _
= New MyAppDataSet.xxxDataTable
strsql = "SELECT CD, NAME FROM xxx WHERE (CD = '001')"
Using DBConnection = tAdpter.Connection
hAdpter.SelectCommand = DBConnection.CreateCommand
hAdpter.SelectCommand.CommandText = strsql
hAdpter.Fill(wTBL)
If wTBL.Rows.Count > 0 Then
TXT_NAME.Text = wTBL.Item(0).NAME
End If
End Using
End Using
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-02-02 11:32
引用:
chiroruさんの書き込み (2009-02-02 11:23) より:

他の人のやり方は、アプリケーションのプロパティの設定で既に、接続文字列を
登録済みのため、データベースのオープン処理をしないというやり方です。



「接続文字列を登録済みだから」ってのは正確ではないですね。
非接続型データアクセスであるテーブルアダプタを使用しているため、接続オープンを明示的に行わないで良い、
というのが適切な表現かと。
明示的に行わなくて良いだけで、内部的には一時的に接続を開いています。

一方、chiroru さんのように SqlCommand を直接使用する方法は、接続型データアクセスです。
接続型データアクセスの場合、明示的な接続オープンは必須です。
接続型と非接続型は、ADO.NET の基本ですので、次は非接続型について学ばれると良いと思います。

_________________
C#と諸々
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-02-02 11:38
あー、コードしっかり読んでみたら、<他の人のコーディング> は何か変わったことやってますね。
テーブルアダプタを、単にコネクションオブジェクトの取得の為にしか使ってないようです。
なぜそういうやり方をしているのかはわかりませんが、
そのコードは決してテーブルアダプタの "一般的な" 使い方ではありませんので注意してください。
_________________
C#と諸々
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-02 13:29
引用:

「接続文字列を登録済みだから」ってのは正確ではないですね。
非接続型データアクセスであるテーブルアダプタを使用しているため、接続オープンを明示的に行わないで良い、
というのが適切な表現かと。
明示的に行わなくて良いだけで、内部的には一時的に接続を開いています。
一方、chiroru さんのように SqlCommand を直接使用する方法は、接続型データアクセスです。
接続型データアクセスの場合、明示的な接続オープンは必須です。
接続型と非接続型は、ADO.NET の基本ですので、次は非接続型について学ばれると良いと思います。


なるほど。なぜ違うのか理解できました。
そこで、非接続型について調べて下記のように記述しました。
しかし、getConnectionStringのところでエラーになります。
エラー:名前'getConnectionString'は宣言されていません。
これはどうしたらいいのですか?初歩的なことで申し訳ありませんがよろしくお願いします。


' 非接続データアクセスでの複数件の検索
Dim sqlDA As SqlDataAdapter
Dim ds As DataSet
Dim i As Integer
' DataAdapter オブジェクトの生成
sqlDA = New SqlDataAdapter()
' DataSet オブジェクトの生成
ds = New DataSet()
' DataAdapter にSelectCommand を追加
sqlDA.SelectCommand = New SqlCommand()
' SelectCommand の各種プロパティを設定
strsql = "SELECT CD, NAME FROM xxx WHERE (CD = '001')" sqlDA.SelectCommand.CommandType = CommandType.Text
sqlDA.SelectCommand.CommandText = strsql
sqlDA.SelectCommand.Connection = New SqlConnection(getConnectionString)
' 検索結果をDataSet へ格納
sqlDA.Fill(ds, "SHICHOSON")
' DataSet 内のテーブル"SHICHOSON"の各レコードに対して処理を実行
If ds.Tables("SHICHOSON").Rows.Count > 0 Then
.txtNAME.Text = ds.Tables("SHICHOSON").Rows(i).Item("NAME").ToString()
End If
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-02 13:38
getConnectionString という ConnectionString を返すメソッドを
宣言すれば良いのでは無いでしょうか。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-02-02 13:44
んー、"getConnectionString" という名前はどこから出てきましたか?

1. どこかにそういう名前のフィールドがあるから
2. どこかにそういう名前のメソッドがあるから
3. 参考にしたコードにそう書いてあったから
4. こういう名前にすればどこからともなく接続文字列が手に入ると思ったから

_________________
C#と諸々
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-02 13:53
引用:

よこけんさんの書き込み (2009-02-02 13:44) より:
んー、"getConnectionString" という名前はどこから出てきましたか?

1. どこかにそういう名前のフィールドがあるから
2. どこかにそういう名前のメソッドがあるから
3. 参考にしたコードにそう書いてあったから
4. こういう名前にすればどこからともなく接続文字列が手に入ると思ったから




すみません。「参考にしたコードにそう書いてあったから」です。
"getConnectionString"が データベースへの接続文字列を引数にしているみたいですが、接続文字列の取得は、下記のように直接記述する以外に方法はありますか?

Public Con As System.Data.SqlClient.SqlConnection
Con = New System.Data.SqlClient.SqlConnection()
Con.ConnectionString = "Data Source=192.168.xx.xxx;Initial Catalog=TestDB;User ID=sa;Password=sa
Con.Open()
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-02-02 14:26
> 接続文字列の取得は、下記のように直接記述する以外に方法はありますか?

設定ファイルに持たせたいのならば、My.Settings が利用できます。

ただ、参考にしたコードが同一アプリのものならば、それを使用した方がよいかもしれません。
もしくは、最初に提示された <他の人のコーディング> が同一アプリのものならば、
これと同じようにした方がよいかもしれません。
その場合は、チームのメンバーに確認してください。

_________________
C#と諸々

スキルアップ/キャリアアップ(JOB@IT)