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

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

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

「接続文字列」を変数に格納

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

■93362 / inTopicNo.1)  「接続文字列」を変数に格納
  
□投稿者/ たかし (23回)-(2019/12/08(Sun) 11:07:01)

分類:[.NET 全般] 

いつもお世話になっております、たかしです。

App.configの「接続文字列」を変数に格納してVB.NETからSQLサーバーに接続しようと思い、
次のようなコードを書きました。
ちなみにForm1の接続文字列TextBoxには
"Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"
と入力してあります。

    Private Sub 実行Button_Click(sender As Object, e As EventArgs) Handles 実行Button.Click

        Dim cn As New SqlClient.SqlConnection
        Dim cd As New SqlClient.SqlCommand
        Dim 接続文字列 As String

        接続文字列 = Form1.接続文字列TextBox.Text
        cn.ConnectionString = 接続文字列
        cn.Open()
    cd.CommandType = CommandType.StoredProcedure
        cd.CommandText = "ストアドプロシージャ名"
        cd.Connection = cn
        cd.ExecuteNonQuery()
    cd.Dispose()
    cn.Close()
    cn.Dispose()

    End Sub

Visual StudioのApp.configタブは次のとおりです。

前略
<connectionStrings>
        <add name="**********.My.MySettings.**********_SQLConnectionString"
            connectionString="Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
後略

なお、変数を用いずにダイレクトに次のように記載すると正常に動きます。
cn.ConnectionString = "Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"

どこがいけないのでしょうか?
どなたかお願いします。


引用返信 編集キー/
■93364 / inTopicNo.2)  Re[1]: 「接続文字列」を変数に格納
□投稿者/ たかし (26回)-(2019/12/08(Sun) 11:11:11)
No93362 (たかし さん) に返信
> いつもお世話になっております、たかしです。
>
> App.configの「接続文字列」を変数に格納してVB.NETからSQLサーバーに接続しようと思い、
> 次のようなコードを書きました。
> ちなみにForm1の接続文字列TextBoxには
> "Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"
> と入力してあります。
>
> Private Sub 実行Button_Click(sender As Object, e As EventArgs) Handles 実行Button.Click
>
> Dim cn As New SqlClient.SqlConnection
> Dim cd As New SqlClient.SqlCommand
> Dim 接続文字列 As String
>
> 接続文字列 = Form1.接続文字列TextBox.Text
> cn.ConnectionString = 接続文字列
> cn.Open()
>     cd.CommandType = CommandType.StoredProcedure
> cd.CommandText = "ストアドプロシージャ名"
> cd.Connection = cn
> cd.ExecuteNonQuery()
>     cd.Dispose()
>     cn.Close()
>     cn.Dispose()
>
> End Sub
>
> Visual StudioのApp.configタブは次のとおりです。
>
> 前略
> <connectionStrings>
> <add name="**********.My.MySettings.**********_SQLConnectionString"
> connectionString="Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"
> providerName="System.Data.SqlClient" />
> </connectionStrings>
> 後略
>
> なお、変数を用いずにダイレクトに次のように記載すると正常に動きます。
> cn.ConnectionString = "Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"
>
> どこがいけないのでしょうか?
> どなたかお願いします。
>
>

補足です。
エラーは cn.Open()の行で出ます。
失礼しました。
引用返信 編集キー/
■93365 / inTopicNo.3)  Re[2]: 「接続文字列」を変数に格納
□投稿者/ WebSurfer (1986回)-(2019/12/08(Sun) 12:27:15)
No93364 (たかし さん) に返信

Settings ファイルに **********.My.MySettings.**********_SQLConnectionString という名前で
格納してあるように見えますが、そうであれば以下のようにしてはいかが?

cn.ConnectionString = Properties.Settings.Default.**********.My.MySettings.**********_SQLConnectionString
引用返信 編集キー/
■93366 / inTopicNo.4)  Re[3]: 「接続文字列」を変数に格納
□投稿者/ たかし (27回)-(2019/12/08(Sun) 13:07:27)
No93365 (WebSurfer さん) に返信
> ■No93364 (たかし さん) に返信
>
> Settings ファイルに **********.My.MySettings.**********_SQLConnectionString という名前で
> 格納してあるように見えますが、そうであれば以下のようにしてはいかが?
>
> cn.ConnectionString = Properties.Settings.Default.**********.My.MySettings.**********_SQLConnectionString

WebSurfer さん、いつもお世話になっております。
ご指示いただいたコードでうまく接続できました。
しかしPropertiesのところでエラーが出ます。

エラー BC30451 'Properties' は宣言されていません。アクセスできない保護レベルになっています。

このエラーを出さないためにはどうしたら良いでしょうか?
よろしくお願いいたします。

引用返信 編集キー/
■93367 / inTopicNo.5)  Re[4]: 「接続文字列」を変数に格納
□投稿者/ たかし (28回)-(2019/12/08(Sun) 13:33:28)
No93366 (たかし さん) に返信
> ■No93365 (WebSurfer さん) に返信
>>■No93364 (たかし さん) に返信
>>
>>Settings ファイルに **********.My.MySettings.**********_SQLConnectionString という名前で
>>格納してあるように見えますが、そうであれば以下のようにしてはいかが?
>>
>>cn.ConnectionString = Properties.Settings.Default.**********.My.MySettings.**********_SQLConnectionString
> 
> WebSurfer さん、いつもお世話になっております。
> ご指示いただいたコードでうまく接続できました。
> しかしPropertiesのところでエラーが出ます。
> 
> エラー	BC30451	'Properties' は宣言されていません。アクセスできない保護レベルになっています。
> 
> このエラーを出さないためにはどうしたら良いでしょうか?
> よろしくお願いいたします。
> 

追記です。
Properties.Settings.Default.**********.My.MySettings.**********_SQLConnectionString
を変数に代入するとやはりcn.Open()の行でエラーが出ます。


引用返信 編集キー/
■93368 / inTopicNo.6)  Re[5]: 「接続文字列」を変数に格納
□投稿者/ WebSurfer (1987回)-(2019/12/08(Sun) 15:13:39)
No93367 (たかし さん) に返信

すみません、C# と間違えてました。VB.NET は名前空間とクラス名が以下のように異なる
ようです。(Settings.Designer.vb 参照)

名前空間: Properties ⇒ My
クラス名: Settings ⇒ MySettings

従って、以下のようになるはずです。お試しください。

誤: cn.ConnectionString = Properties.Settings.Default.**********.My.MySettings.**********_SQLConnectionString

正: cn.ConnectionString = My.MySettings.Default.**********.My.MySettings.**********_SQLConnectionString


引用返信 編集キー/
■93369 / inTopicNo.7)  Re[5]: 「接続文字列」を変数に格納
□投稿者/ WebSurfer (1988回)-(2019/12/08(Sun) 15:28:07)
No93367 (たかし さん) に返信

もう少し具体的に書くと、例えば以下のように Settings ファイルに NORTHWINDConnectionString という
名前で接続文字列を保存した場合。(ここは画像が貼れませんので自分ののレンタルサーバーに画像アップ
してそのリンクを張っておきます)

http://surferonwww.info/BlogEngine/image.axd?picture=2019%2f12%2fsettings.jpg

My.MySettings.Default.NORTHWINDConnectionString で接続文字列を取得できます。以下の画像を見てくだ
さい。

http://surferonwww.info/BlogEngine/image.axd?picture=2019%2f12%2fresult.jpg
引用返信 編集キー/
■93370 / inTopicNo.8)  Re[6]: 「接続文字列」を変数に格納
□投稿者/ w1909 (1回)-(2019/12/08(Sun) 16:26:51)
2019/12/08(Sun) 19:05:25 編集(投稿者)
2019/12/08(Sun) 19:05:20 編集(投稿者)

>ちなみにForm1の接続文字列TextBoxには
>"Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"

テキストボックスの値、最初と最後にダブルクォーテーションがあるんですか?

念のため確認 変数の値ではなく、テキストボックスに入力してある値です。
引用返信 編集キー/
■93372 / inTopicNo.9)  Re[7]: 「接続文字列」を変数に格納
□投稿者/ たかし (30回)-(2019/12/08(Sun) 17:54:30)
No93370 (w1909 さん) に返信
> >ちなみにForm1の接続文字列TextBoxには
> >"Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"
>
> テキストボックスの値、最初と最後にダブルクォーテーションがあるんですか?

Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True
"Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"

変数にはダブルクォーテーションあるなしの場合両方ともエラーとなります。


引用返信 編集キー/
■93381 / inTopicNo.10)  Re[1]: 「接続文字列」を変数に格納
□投稿者/ KOZ (64回)-(2019/12/08(Sun) 21:50:57)
2019/12/08(Sun) 22:00:04 編集(投稿者)
No93362 (たかし さん) に返信
> <connectionStrings>
>         <add name="**********.My.MySettings.**********_SQLConnectionString"
>             connectionString="Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"
>             providerName="System.Data.SqlClient" />
>     </connectionStrings>

System.Configuration を参照設定して

Imports System.Data.Common
Imports System.Configuration

Const connectionName As String = "**********.My.MySettings.**********_SQLConnectionString"
Dim config As ConnectionStringSettings =
        ConfigurationManager.ConnectionStrings(connectionName)

としておいて

Dim factory As DbProviderFactory = DbProviderFactories.GetFactory(config.ProviderName)
Dim con As DbConnection = factory.CreateConnection()
con.ConnectionString = config.ConnectionString
con.Open()

もしくは

Dim cn As New SqlClient.SqlConnection
cn.ConnectionString = config.ConnectionString
cn.Open()

でどうでしょうか。

引用返信 編集キー/
■93382 / inTopicNo.11)  Re[2]: 「接続文字列」を変数に格納
□投稿者/ たかし (31回)-(2019/12/09(Mon) 12:25:26)
No93381 (KOZ さん) に返信
> 2019/12/08(Sun) 22:00:04 編集(投稿者)
>
> ■No93362 (たかし さん) に返信
>><connectionStrings>
>> <add name="**********.My.MySettings.**********_SQLConnectionString"
>> connectionString="Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"
>> providerName="System.Data.SqlClient" />
>> </connectionStrings>
>
> System.Configuration を参照設定して
>
> Imports System.Data.Common
> Imports System.Configuration
>
> Const connectionName As String = "**********.My.MySettings.**********_SQLConnectionString"
> Dim config As ConnectionStringSettings =
> ConfigurationManager.ConnectionStrings(connectionName)
>
> としておいて
>
> Dim factory As DbProviderFactory = DbProviderFactories.GetFactory(config.ProviderName)
> Dim con As DbConnection = factory.CreateConnection()
> con.ConnectionString = config.ConnectionString
> con.Open()
>
> もしくは
>
> Dim cn As New SqlClient.SqlConnection
> cn.ConnectionString = config.ConnectionString
> cn.Open()
>
> でどうでしょうか。
>

質問の趣旨をこの辺でもう一度はっきりさせたいと思います。
「接続文字列」を変数に格納するにはどうしたらよいか?
その一点です。

変数を用いずにダイレクトに次のように記載すると正常に動きます。
cn.ConnectionString = "Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"

ところが、

Dim 接続文字列 As String

接続文字列 = Form1.接続文字列TextBox.Text
cn.ConnectionString = 接続文字列

というコードではエラーになる。
これのどこが間違えているのか?
そこが知りたいのです。
ちなみにcn.Open()のエラーのメッセージは
「System.InvalidOperationException: 'ConnectionString プロパティは初期化されていません。'」
というものです。

その線でアドバイスが頂けるとありがたいです。


引用返信 編集キー/
■93384 / inTopicNo.12)  Re[3]: 「接続文字列」を変数に格納
□投稿者/ Hongliang (936回)-(2019/12/09(Mon) 12:49:14)
> ちなみにcn.Open()のエラーのメッセージは
> 「System.InvalidOperationException: 'ConnectionString プロパティは初期化されていません。'」
> というものです。
これが初めから提示されていれば寄り道は小さかったかもしれません。

さて、このメッセージからは、
・ConnectionStringプロパティに値を設定できていない
・ConnectionStringプロパティに設定したのがNothingまたは空文字列だった
のいずれかの可能性が想定されます。

まず、
cn.ConnectionString = 接続文字列
の行にブレークポイントを置いて、そこでブレークするまで実行し、
Visual Studioの「ローカル」ウィンドウにて、
<接続文字列>変数に格納されている値を確認してみてください。
引用返信 編集キー/
■93386 / inTopicNo.13)  Re[3]: 「接続文字列」を変数に格納
□投稿者/ KOZ (65回)-(2019/12/09(Mon) 13:27:34)
No93382 (たかし さん) に返信
>         接続文字列 = Form1.接続文字列TextBox.Text

デフォルトのインスタンスを使ってますが、理解して使ってらっしゃいますか?

「My.Forms オブジェクト」
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/objects/my-forms-object

実行Button と同一のフォームに 接続文字列TextBox があるなら

    接続文字列 = Me.接続文字列TextBox.Text

でいいですし、違うフォームなら

    Dim 接続文字列 As String = String.Empty
    For Each f As Form In Application.OpenForms
        Dim f1 As Form1 = TryCast(f, Form1)
        If f1 IsNot Nothing Then
            接続文字列 = f1.接続文字列TextBox.Text
            If Not String.IsNullOrEmpty(接続文字列) Then
                Exit For
            End If
        End If
    Next

とインスタンスを検索したり、あらかじめ、実行Button_Click からアクセスできる範囲に
Form1 のインスタンスを保持しておく必要があります。

引用返信 編集キー/
■93388 / inTopicNo.14)  Re[3]: 「接続文字列」を変数に格納
□投稿者/ WebSurfer (1989回)-(2019/12/09(Mon) 13:31:46)
No93382 (たかし さん) に返信

> Dim 接続文字列 As String
>
> 接続文字列 = Form1.接続文字列TextBox.Text
> cn.ConnectionString = 接続文字列
>
> というコードではエラーになる。
> これのどこが間違えているのか?
> そこが知りたいのです。

他にコードはないのですか? 「Form1.接続文字列TextBox.Text」に接続文字列を代入するコードはないの
ですか?

なければ、「cn.ConnectionString = 接続文字列」で接続未字列は代入できず、空になっているのでは?

そんな基本のキで間違うことはないということなら失礼しました。でも、それなら「Form1.接続文字列TextBox.Text」
に接続文字列をどのように代入しているのか書いてください。
ですか?

引用返信 編集キー/
■93389 / inTopicNo.15)  Re[4]: 「接続文字列」を変数に格納
□投稿者/ たかし (32回)-(2019/12/09(Mon) 17:47:23)
No93388 (WebSurfer さん) に返信
> ■No93382 (たかし さん) に返信
>
>>Dim 接続文字列 As String
>>
>> 接続文字列 = Form1.接続文字列TextBox.Text
>> cn.ConnectionString = 接続文字列
>>
>>というコードではエラーになる。
>>これのどこが間違えているのか?
>>そこが知りたいのです。
>
> 他にコードはないのですか? 「Form1.接続文字列TextBox.Text」に接続文字列を代入するコードはないの
> ですか?
>
> なければ、「cn.ConnectionString = 接続文字列」で接続未字列は代入できず、空になっているのでは?
>
> そんな基本のキで間違うことはないということなら失礼しました。でも、それなら「Form1.接続文字列TextBox.Text」
> に接続文字列をどのように代入しているのか書いてください。
> ですか?
>

#93372で書いたとおり

Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True
"Data Source=(local)\SQLEXPRESS;Initial Catalog=**********SQL;Integrated Security=True"

の二通りで試しましたがいずれもエラーとなります。

引用返信 編集キー/
■93390 / inTopicNo.16)  Re[4]: 「接続文字列」を変数に格納
□投稿者/ たかし (34回)-(2019/12/09(Mon) 17:57:58)
No93384 (Hongliang さん) に返信
>>ちなみにcn.Open()のエラーのメッセージは
>>「System.InvalidOperationException: 'ConnectionString プロパティは初期化されていません。'」
>>というものです。
> これが初めから提示されていれば寄り道は小さかったかもしれません。
>
> さて、このメッセージからは、
> ・ConnectionStringプロパティに値を設定できていない
> ・ConnectionStringプロパティに設定したのがNothingまたは空文字列だった
> のいずれかの可能性が想定されます。
>
> まず、
> cn.ConnectionString = 接続文字列
> の行にブレークポイントを置いて、そこでブレークするまで実行し、
> Visual Studioの「ローカル」ウィンドウにて、
> <接続文字列>変数に格納されている値を確認してみてください。

おっしゃるとおり「""」となっています。
なぜなのでしょう?


引用返信 編集キー/
■93391 / inTopicNo.17)  Re[4]: 「接続文字列」を変数に格納
□投稿者/ たかし (35回)-(2019/12/09(Mon) 18:09:34)
No93386 (KOZ さん) に返信
> ■No93382 (たかし さん) に返信
>> 接続文字列 = Form1.接続文字列TextBox.Text
>
> デフォルトのインスタンスを使ってますが、理解して使ってらっしゃいますか?
>
> 「My.Forms オブジェクト」
> https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/objects/my-forms-object
>
> 実行Button と同一のフォームに 接続文字列TextBox があるなら
>
> 接続文字列 = Me.接続文字列TextBox.Text
>
> でいいですし、違うフォームなら
>
> Dim 接続文字列 As String = String.Empty
> For Each f As Form In Application.OpenForms
> Dim f1 As Form1 = TryCast(f, Form1)
> If f1 IsNot Nothing Then
> 接続文字列 = f1.接続文字列TextBox.Text
> If Not String.IsNullOrEmpty(接続文字列) Then
> Exit For
> End If
> End If
> Next
>
> とインスタンスを検索したり、あらかじめ、実行Button_Click からアクセスできる範囲に
> Form1 のインスタンスを保持しておく必要があります。
>

ご提示いただいたコードで無事接続ができました!
ありがとうございます。

引用返信 編集キー/
■93392 / inTopicNo.18)  Re[5]: 「接続文字列」を変数に格納
□投稿者/ たかし (36回)-(2019/12/09(Mon) 19:01:50)
No93391 (たかし さん) に返信
> ■No93386 (KOZ さん) に返信
>>■No93382 (たかし さん) に返信
> >> 接続文字列 = Form1.接続文字列TextBox.Text
>>
>>デフォルトのインスタンスを使ってますが、理解して使ってらっしゃいますか?
>>
>>「My.Forms オブジェクト」
>>https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/objects/my-forms-object
>>
>>実行Button と同一のフォームに 接続文字列TextBox があるなら
>>
>> 接続文字列 = Me.接続文字列TextBox.Text
>>
>>でいいですし、違うフォームなら
>>
>> Dim 接続文字列 As String = String.Empty
>> For Each f As Form In Application.OpenForms
>> Dim f1 As Form1 = TryCast(f, Form1)
>> If f1 IsNot Nothing Then
>> 接続文字列 = f1.接続文字列TextBox.Text
>> If Not String.IsNullOrEmpty(接続文字列) Then
>> Exit For
>> End If
>> End If
>> Next
>>
>>とインスタンスを検索したり、あらかじめ、実行Button_Click からアクセスできる範囲に
>>Form1 のインスタンスを保持しておく必要があります。
>>
>
> ご提示いただいたコードで無事接続ができました!
> ありがとうございます。
>

解決済みです。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ