-1

タイトルが示すように、永続的なデータベース接続に少し問題があります。ここには、2 つのデータベースがあります。1 つは開発およびテスト用で、もう 1 つは公式の本番用です。以前は、テストおよびデプロイ時にさまざまな接続文字列を手動で変更していましたが、奇妙なエラーが発生することがありました。dev データベースを停止すると、本番アプリケーション全体が突然動作を停止し、SQL 接続が失われたというメッセージが表示されました。しかし、web.config はテスト環境ではなく本番環境を指していました!

いくつかの調査の後、web.config 変換を見つけ、それが問題を解決すると考えました。そうではありませんでした。web.config が単一の参照を作成していない場合でも、アプリケーションが開発環境にタイトであるかのように、問題は解決しません。

わかりやすくするために、接続文字列、変換、発生した最新の SQL エラー (いくつかの更新のために開発データベースをシングルユーザーに制限したとき) に加えて、それを DBML (L2SQL) に接続する方法を投稿します。 .

接続文字列

<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>

    <!--ConnectionString Central-->
    <add name="OperationsBD" connectionString="Data Source=DEVSERVER\DEV;Initial Catalog=OPERATION;Persist Security Info=True;User ID=lab;Password=devPassword" providerName="System.Data.SqlClient"/>
    <add name="AnalisysBD" connectionString="Data Source=DEVSERVER\DEV;Initial Catalog=ANALISYS;Persist Security Info=True;User ID=lab;Password=devPassword" providerName="System.Data.SqlClient"/> 

<!--Production ConnectionString-->
    <!--<add name="OperationsDB" connectionString="Data Source=PRODSERVER\COMPANY;Initial Catalog=OPERATION;Persist Security Info=True;User ID=company;Password=prodPassword" providerName="System.Data.SqlClient"/>
    <add name="AnalisysDB" connectionString="Data Source=PRODSERVER\COMPANY;Initial Catalog=ANALISYS;Persist Security Info=True;User ID=company;Password=prodPassword" providerName="System.Data.SqlClient"/>-->

WEB.CONFIG 変換 (本番)

<connectionStrings>
      <add name="OperationsDB" 
        connectionString="Data Source=PRODSERVER\COMPANY;Initial Catalog=OPERATION;Persist Security Info=True;User ID=company;Password=prodPassword" 
           providerName="System.Data.SqlClient"
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>

      <add name="AnalisysDB"
        connectionString="Data Source=PRODSERVER\COMPANY;Initial Catalog=ANALISYS;Persist Security Info=True;User ID=company;Password=prodPassword"
           providerName="System.Data.SqlClient"
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>

WEB.CONFIG 変換 (開発)

<connectionStrings>
      <add name="OperationsDB"
        connectionString="Data Source=DEVSERVER\DEV;Initial Catalog=OPERATION;Persist Security Info=True;User ID=lab;Password=devPassword"
           providerName="System.Data.SqlClient"
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>

      <add name="AnalisysDB"
        connectionString="Data Source=DEVSERVER\DEV;Initial Catalog=ANALISYS;Persist Security Info=True;User ID=lab;Password=devPassword"
           providerName="System.Data.SqlClient"
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>

SQL エラー (開発環境でのシングル ユーザー制限)

Cannot open database "operation" requested by the login. The login failed. Login failed for user 'lab'.

そして最後に、それを LINQ to SQL DBML に接続する方法

public partial class OperationDataContext
    {
        private const string OPERATION_CONN_STRING = "OperationsDB";
        public OperationDataContext()
            : base(System.Configuration.ConfigurationManager.ConnectionStrings[OPERATION_CONN_STRING].ConnectionString, mappingSource)
        {
            OnCreated();
        }
    }

    public partial class AnalisysDataContext
    {
        private const string ANALISYS_CONN_STRING = "AnalisysDB";
        public AnalisysDataContext()
            : base(System.Configuration.ConfigurationManager.ConnectionStrings[ANALISYS_CONN_STRING].ConnectionString, mappingSource)
        {
            OnCreated();
        }
    }
4

1 に答える 1

0

これは単なるタイプミスかもしれませんが、Dev の「名前」は「OperationsBD」と「AnaylsisBD」でしたが、変換は「OperationsDB」と「AnaylsisDB」の名前に一致するように設定されていることに気付きました。これがタイプミスでない場合、決して一致しないため、接続文字列が置き換えられることはありません。

于 2013-04-23T18:43:17.547 に答える