質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

2105閲覧

Form2で取得した変数をForm1で使用する方法

退会済みユーザー

退会済みユーザー

総合スコア0

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/08/01 00:39

編集2016/08/01 14:13

以下のようにコードを書きました。
しかし、
ds As String = nd0.Attributes().Item("0").InnerText
の部分でエラーが発生してしまいます。
自分ではどうしてエラーが出るのかいまいちわかりません。
教えていただけますでしょうか。

エラー情報
型 'System.NullReferenceException' のハンドルされていない例外が WindowsApplication1.exe で発生しました
追加情報:オブジェクト参照がオブジェクト インスタンスに設定されていません。

Imports MySql.Data.MySqlClient Imports System.Xml Public Class Form1 Public Function myOpen() As Boolean dim myConnection As MySqlConnection = Nothing dim f2 As Form2 = New Form2 Try If myConnection Is Nothing Then myConnection = New MySqlConnection End If If myConnection.State = ConnectionState.Closed Then Dim cst As String = "" f2.getcnt = myConnection.ConnectionTimeout cst = cst & ";Database=" & f2.getds cst = cst & ";Data Source=" & f2.getdb cst = cst & ";User Id=" & f2.getui cst = cst & ";Password=" & f2.getpword myConnection.ConnectionString = cst myConnection.Open() End if Catch ex As Exception Logger.Error(ex) Return False End Try Return True End Function End Class
Imports MySql.Data.MySqlClient Imports System.Xml Public Class Form2 Public doc As XmlDocument = New XmlDocument Public Sub st() Call doc.Load("settingFile.xml") End Sub Public rootElement As System.Xml.XmlElement = doc.DocumentElement Public nd0 As XmlNode = doc.SelectSingleNode("/Setting/dsName") Public ds As String = nd0.Attributes().Item("0").InnerText Public nd1 As XmlNode = doc.SelectSingleNode("/Setting/dbName") Public db As String = nd1.Attributes().Item("0").InnerText Public nd2 As XmlNode = doc.SelectSingleNode("/Setting/userId") Public ui As String = nd2.Attributes().Item("0").InnerText Public nd3 As XmlNode = doc.SelectSingleNode("/Setting/pw") Public pword As String = nd3.Attributes().Item("0").InnerText Public Property getds() As String Get Return ds End Get Set(ByVal value As String) ds = value End Set End Property Public Property getdb() As String Get Return db End Get Set(ByVal value As String) db = value End Set End Property Public Property getui() As String Get Return ui End Get Set(ByVal value As String) ui = value End Set End Property Public Property getpword() As String Get Return pword End Get Set(ByVal value As String) pword = value End Set End Property End Class

Form1だけで実行する場合、成功していました。
今回、今後私以外にも使用していく人がいるため、わかりやすいように分割して、と言われてForm2に分けています。
ちなみにForm1だけの場合ちゃんと動いています。

'部分抜粋 If myConnection Is Nothing Then myConnection = New MySqlConnection End If If myConnection.State = ConnectionState.Closed Then Call doc.Load("settingFile.xml") Dim rootElement As System.Xml.XmlElement = doc.DocumentElement Dim nd0 As XmlNode = doc.SelectSingleNode("/Setting/dsName") Dim ds As String = nd0.Attributes().Item("0").InnerText Dim nd1 As XmlNode = doc.SelectSingleNode("/Setting/dbName") Dim db As String = nd1.Attributes().Item("0").InnerText Dim nd2 As XmlNode = doc.SelectSingleNode("/Setting/userId") Dim ui As String = nd2.Attributes().Item("0").InnerText Dim nd3 As XmlNode = doc.SelectSingleNode("/Setting/pw") Dim pword As String = nd3.Attributes().Item("0").InnerText Dim cst As String = "" cnt = myConnection.ConnectionTimeout cst = cst & ";Database=" & ds cst = cst & ";Data Source=" & db cst = cst & ";User Id=" & ui cst = cst & ";Password=" & pword myConnection.ConnectionString = cst myConnection.Open() End If

分割の仕方がうまくないと思うのですが、どうしたらよいでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

今の状況であればコンストラクタで値の取得をすると良くなるでしょう。
また、せっかくgetXXを作っているのでそれで取れる変数はprivateにして外部から隠しましょう。

具体的には
Public Sub st()からPublic pword As String = nd3.Attributes().Item("0").InnerText
を以下のようにすると良くなると思います。(コンパイルしてないので何かミスはあるかもしれません)

vb

1 Public Sub New() 2 Call doc.Load("settingFile.xml") 3 Dim nd0 As XmlNode = doc.SelectSingleNode("/Setting/dsName") 4 ds = nd0.Attributes().Item("0").InnerText 5 Dim nd1 As XmlNode = doc.SelectSingleNode("/Setting/dbName") 6 db = nd1.Attributes().Item("0").InnerText 7 Dim nd2 As XmlNode = doc.SelectSingleNode("/Setting/userId") 8 ui = nd2.Attributes().Item("0").InnerText 9 Dim nd3 As XmlNode = doc.SelectSingleNode("/Setting/pw") 10 pword = nd3.Attributes().Item("0").InnerText 11 End Sub 12 13 Public rootElement As System.Xml.XmlElement = doc.DocumentElement 14 15 Private ds As String = nd0.Attributes().Item("0").InnerText 16 Private db As String = nd1.Attributes().Item("0").InnerText 17 Private ui As String = nd2.Attributes().Item("0").InnerText 18 Private pword As String = nd3.Attributes().Item("0").InnerText

あとこのままだと 以下の部分はgetcntがなくてエラーになりそうな気がします。

f2.getcnt = myConnection.ConnectionTimeout

以下は、今のForm2でうまくいってからでもいいですが気になった点です。

  • Formではなくクラスに分けたほうが良いでしょう。

画面である必要ない気がします。

  • 合わせてForm2とかClass1という名前を再考しましょう。何を提供してくれるクラスか分からなければ、他の人は困ってしまいます。
  • getXX ではなく XX と、先頭を大文字な変数名のようにしてください(プロパティなので)。

ただし名前がローカル変数と衝突するので、どちらかを変える必要があります。
個人的にはプロパティ(元getXX)の方を省略しない長い名前にしたらいいかなと思います。

  • Readonlyをつけると読み取り専用のプロパティ(Setをつけられないプロパティ)を作成できます。

Uiやpwordなどに外から値をセットできる必要はないと思うので。

投稿2016/08/01 03:21

flied_onion

総合スコア2604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/01 14:17

わかりやすいご回答ありがとうございます。 ヒントを得て書き直すことができました。 ConnectionTimeoutは以下のように直してうまくいきました。 cst = cst & ";Password=" &  CntToT
guest

0

例外が出て止まっている時点のnd0の値を見てみましょう

nd0がNothingなのか、nd0の中の値の取り方がまずいのかがわかるはずです

投稿2016/08/01 01:09

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/01 02:42

gusaoさんが言われた通り、doc.Loadできなくてnd0が値をとれなくなったと思います。 ほかに良い方法はないでしょうか。 よろしくお願いいたします。
guest

0

XMLファイルを読み込んでいないのが原因ではないでしょうか。
この処理が動作していない気がします。

vbnet

1Public Sub st() 2 Call doc.Load("settingFile.xml") 3End Sub

投稿2016/08/01 01:07

gusao

総合スコア185

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/08/01 02:41

はい、取れてないと思います。 しかし、property get を使うためには、グローバル変数にするしかなかったのですが、そうすると今回のようにdoc.Loadが取れません。 ほかに良い方法はあるでしょうか。
gusao

2016/08/01 02:48

Form2のプロパティから取得するのであれば。 コンストラクタでXMLの読み込み、要素の取得をするのがよいと思います。 ※自分なら、FormでなくClassで、接続文字列まるまる返却するメソッドに分割しちゃいますが。
退会済みユーザー

退会済みユーザー

2016/08/01 14:20

ありがとうございます。 なんとか直すことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問