C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: クラスの参照について [1]


(過去ログ 80 を表示中)

[トピック内 24 記事 (21 - 24 表示)]  << 0 | 1 >>

■47556 / inTopicNo.21)  Re[20]: クラスの参照について
  
□投稿者/ もりお (196回)-(2010/03/05(Fri) 16:15:38)
No47555 (だい さん) に返信

> コントロールにパラメータとなるプロパティを持たせるということですか。
> Txt_HinCD.HinCDはちょっと複雑化しているような気もします。

これには同意します。
そもそも TextBox の派生クラスにする必要はないのではないでしょうか。
パラメータを保持するだけのクラスを用意して DataBinding で TextBox と関連付けると
いうやり方ではだめなのでしょうか。

Public Class Form1
  Private Parameter_ As New Parameter()

  Private Sub Form1_Load(...) Handles MyBase.Load
    TextBox1.DataBindings.Add("Text", Parameter_, "HogeTable.HinCD.Value")
    TextBox2.DataBindings.Add("Text", Parameter_, "HogeTable.HinName.Value")
  End Sub

  Private Sub ButtonSelect_Click(...) Handles ButtonSelect.Click
    ...
    Dim command As New OleDbCommand()
    command.CommandText = _
        "Select * From `HogeTable` Where `hin_cd` = ? And `hin_name` = ?"
    command.Parameters.Add(Parameter_.HogeTable.HinCD)
    command.Parameters.Add(Parameter_.HogeTable.HinName)
    ...
  End Sub
End Class

Public Class Parameter
  Private HogeTable_ As New HogeTable()

  Public Sub New()
  End Sub

  Public ReadOnly Property HogeTable() As HogeTable
    Get
      Return HogeTable_
    End Get
  End Property
End Class

Public Class HogeTable
  Private HinCD_ As New OleDbParameter("@hin_cd", OleDbType.Integer)
  Private HinName_ As New OleDbParameter("@hin_name", OleDbType.VarChar)

  Public Sub New()
  End Sub

  Public ReadOnly Property HinCD() As OleDbParameter
    Get
      Return HinCD_
    End Get
  End Property

  Public ReadOnly Property HinName() As OleDbParameter
    Get
      Return HinName_
    End Get
  End Property
End Class

> clsParametersに値をセットするにはインスタンスを作成しなければならない。この場
> 合はNewしても大丈夫なので、セットまでは可能。
> 次にclsParametersの値を読む際も同様にインスタンスしなければならない。が、イン
> スタンスを作成してしまうとNewされるので値はブランクとなる。

値を読む際に新しいインスタンスを作成してはいけないです。値をセットする際に作成し
たインスタンスを参照する必要があります。

引用返信 編集キー/
■47557 / inTopicNo.22)  Re[21]: クラスの参照について
□投稿者/ だい (42回)-(2010/03/05(Fri) 16:59:10)
たびたびありがとうございます。


思ったんですが、実際に価を持っているのはどこなのでしょうか?
ParametersクラスのTextが実際に値を持っているので、どこからでも参照すればその値を取得できると思っていたのですが、違うのですか?

派生コントロールはEnter押下で次のコントロールに行く処理が必要で一個一個書いていくとものすごい量になるから必要なんです。
同様にLostFocusでフィールドに対応したテキストボックスの値をパラメータに追加する必要がありますが、これも一個一個書いていくしかないのでしょうか?
引用返信 編集キー/
■47560 / inTopicNo.23)  Re[22]: クラスの参照について
□投稿者/ もりお (197回)-(2010/03/05(Fri) 21:59:49)
No47557 (だい さん) に返信

> 思ったんですが、実際に価を持っているのはどこなのでしょうか?
> ParametersクラスのTextが実際に値を持っているので、どこからでも参照すればその値
> を取得できると思っていたのですが、違うのですか?

違うような違わないような気もしますが認識としては甘いです。
値を持つのは Parameters クラスのインスタンスです。

たとえばこんなコードの場合

Public Class Parameters
  Private Text_ As String
  
  Public Sub New()
  End Sub
  
  Public Property Text() As String
    Get
      If Text_ Is Nothing Then
        Return String.Empty
      End If
      Return Text_
    End Get
    Set(value As String)
      Text_ = value
    End Set
  End Property
End Class

Parameters というのはクラスです。
Dim parameters1 As New Parameters()
Dim parameters2 As New Parameters()
とした場合の
parameters1 と parameters2 は Parameters クラスのインスタンスです。
それぞれ異なるインスタンスなので
parameters1.Text = "hoge"
としても
parameters2.Text は "hoge" にはなりません。

引用返信 編集キー/
■47569 / inTopicNo.24)  Re[13]: クラスの参照について
□投稿者/ もりお (198回)-(2010/03/07(Sun) 01:16:04)
No47537 (魔界の仮面弁士 さん) に返信
> ■No47535 (だい さん) に返信
>>名前付きパラメータも使えないし、順不同に入力される可能性があるので?も使えない
>>ですし…。
> SQL 中で、『PARAMETERS』宣言をすれば OK です。

Create Table `test` (`id` Integer)
こんなテーブルを作成して
データとして
1
2
3
を登録して
下記のプログラムを記述しました。

Sub Main()
  Using connection As New OleDbConnection()
    connection.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=H:\test.mdb"
    Using command As New OleDbCommand()
      command.Connection = connection
      command.CommandText = _
          "PARAMETERS p1 Integer, p2 Integer, p3 Integer; " & _
          "SELECT `id` FROM `test` WHERE `id` = p1;"
      command.Parameters.Add("p3", OleDbType.Integer).Value = 3
      command.Parameters.Add("p2", OleDbType.Integer).Value = 2
      command.Parameters.Add("p1", OleDbType.Integer).Value = 1
      Try
        connection.Open()
        Using dataReader As OleDbDataReader = command.ExecuteReader()
          Do While dataReader.Read()
            Console.WriteLine(dataReader.GetInt32(0))
          Loop
        End Using
      Finally
        connection.Close()
      End Try
    End Using
  End Using
  Console.WriteLine("[complete]")
  Console.ReadKey()
End Sub

期待する出力は 1 なのですが
実際には 3 と出力されます。
PARAMETERS 文にて宣言するパラメーターマーカーと OleDbParameter は
Command.Parameters に OleDbParameter を追加する順番によってマッピングされている
ような予感です。
もしそうだとしますと順不同に入力されることには対応できないような気がします。

引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -