3

SQL Server 2005 データベースのフロントエンドとして機能する C# で開発中の Winforms アプリがあります。実行可能ファイルをテスト マシンに展開して実行しました。私が行った変更の最後のラウンドまで、テスト マシンで完全に正常に動作しました。ただし、テスト マシンでは、開くとすぐに次の例外がスローされます。

System.NullReferenceException: Object reference not set to an instance of an object.
       at PSRD_Specs_Database_Administrat.mainMenu.mainMenu_Load(Object sender, EventArgs e)
       at System.Windows.Forms.Form.OnLoad(EventArgs e)
       at System.Windows.Forms.Form.OnCreateControl()
       at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
       at System.Windows.Forms.Control.CreateControl()
       at System.Windows.Forms.Control.WmShowWindow(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at System.Windows.Forms.ContainerControl.WndProc(Message& m)
       at System.Windows.Forms.Form.WmShowWindow(Message& m)
       at System.Windows.Forms.Form.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

このバージョンで変更した mainMenu_Load に関する唯一の変更点は、データベースへの接続文字列を呼び出す方法です。以前は、次のように、呼び出す必要のあるすべてのフォームに接続文字列を含む文字列を設定していました。

string conString = "Data Source = SHAREPOINT;Trusted_Connection = yes;" +
                   "database = CustomerDatabase;connection timeout = 15";

アプリが成長し、それにフォームを追加したので、App.config をプロジェクトに追加することにしました。その中で接続文字列を定義しました:

<connectionStrings>
  <add name="conString"
   providerName="System.Data.SqlClient"
   connectionString="Data Source = SHAREPOINT;Trusted_Connection = yes;database = CustomerDatabase;connection timeout = 15" />
</connectionStrings>

次に、conString を返す静的文字列を作成しました。

public static string GetConnectionString(string conName)
{
    string strReturn = string.Empty;
    if (!(string.IsNullOrEmpty(conName)))
    {
        strReturn = ConfigurationManager.ConnectionStrings[conName].ConnectionString;
    }
    else
    {
        strReturn = ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
    }
    return strReturn;
}

conString 変数を削除し、次のように接続文字列を呼び出します。

PublicMethods.GetConnectionString("conString").ToString()

これは私にエラーを与えているようです。これらのインスタンスを変更して、GetConnectionString を使用せずに App.config から接続文字列を直接呼び出すようにしました。たとえば、SQLConnection では次のようになります。

using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString))

これも例外をスローしました。しかし、各フォームで conString 変数を使用するように戻したところ、問題は発生しませんでした。私が理解していないのは、App.configを直接使用するか、作成した静的文字列を介してスロー例外を使用しているときに、3つの方法すべてが私の開発マシンで正常に機能する理由です。

4

1 に答える 1

4

わかりました、ばかげた質問。テスト マシンの app.config に接続文字列を追加しましたか? そして、あなたはそれを正しくつづったと確信していますか?app.config の正しい場所に connectionStrings セクションを配置しましたか? また、app.config を正しい場所に置いていますか? app.cfg や app.cofig ではなく、「app.config」を正しく綴っていますか?

于 2010-05-11T20:20:24.960 に答える