2016-10-05 3 views
1

を働いていない私は、接続文字列を定義するためにApp.configファイルを作成し、そのプロジェクトに続いてリポジトリファイル次DapperのORMでのConnectionString

using Dapper; 
using System.Configuration; 

namespace ProjectName.Repository 
{ 
    public class SMRTRepository : IDashboard 
    { 
     public SqlConnection con; 
     //To Handle connection related activities 
     private void connection() 
     { 
      string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString(); 
      con = new SqlConnection(constr); 
     } 

     ......... 
    } 
} 

を作成し、

App.configを

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
    <add name="ConnectionString" connectionString="Data Source=USER-PC;Initial Catalog=DBNAME;User ID=sa;Password=****;Integrated Security=True;" providerName="System.Data.sqlclient"/> 
    </connectionStrings> 
</configuration> 

しかし、これを実行すると、DBに接続していない、Visual Studioの[サーバーエクスプローラー]ウィンドウで、Dに接続する接続文字列が表示される赤色のアイコンのないB

いただきました間違った私のアプローチで

以下
+0

_Integrated Security = True_または_User ID = ...._?私は 'しようとした統合セキュリティ= SSPI'は、そのが – Steve

+0

@Steveを選択してください - フォーマット ' "サーバー=サーバー名以下この 使用削除、データベースのDBNAME =;ユーザーID = sa;パスワード=パス " または " "データソース= .;初期カタログ= dbName;統合セキュリティ= True" ' –

+0

providerNameで=「System.Data.SqlClientの」も動作していない1 – GauravKP

答えて

0

は私のプロジェクトの1からのサンプルコードブ​​ロックです。その私のためにうまく動作します。参照してください

using (IDbConnection connection = new SqlConnection(ConnectionString)) 
     { 
      // Query 
      string query = "Query"; 

      DynamicParameters dp = new DynamicParameters(); 
      dp.Add("@userName", userName, DbType.AnsiString); 

      return connection.Query<Model>(query, commandType: CommandType.StoredProcedure, param: dp); 
     } 
+0

これがなぜその質問に答えるのですか? – Steve

2

Integrated Security = TrueとSql User IDの両方を指定するわけではありません。ユーザーIDとパスワードが指定されており、統合セキュリティをtrueに を設定されている場合、統合セキュリティオプションライン上explained by MSDN

として、ユーザーIDとパスワードは無視され、統合された セキュリティが使用されます。

これは、Sql ServerをインストールしたときにWindows統合を有効にする必要があり、現在のWindowsユーザーがそのサーバーの承認されたユーザーの間に表示されていることを意味します。

もう1つの考えられる問題は、グローバル接続オブジェクトの何らかの誤った取り扱いによって発生します。良い習慣として、接続のようなグローバルな使い捨てオブジェクトを避けるほうがよいです。

私はあなたにも、異なるクラスに2つのメソッドを分離し、あなたが構築する必要があり、他のすべてのリポジトリのクラスを提供しています静的メソッドとして最初のメソッドを使用することができます。もちろん、

namespace ProjectName.Repository 
{ 
    public class SMRTRepository : IDashboard 
    { 
     private SqlConnection OpenConnection() 
     { 
      string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString(); 
      SqlConnection con = new SqlConnection(constr); 
      con.Open(); 
      return con; 
     } 
     .... 

     public IEnumerable<Something>Select(string queryFilter) 
     { 
      using (SqlConnection cnn = this.OpenConnection()) 
      { 
       return cnn.Query<Something>(queryFilter); 
      } 
     } 
    } 
} 

であるためにあなたのクラスを変更します。このようにして、グローバルオブジェクトはありません。使用ブロックは、例外の場合でも使い捨てオブジェクトの適切なクリーンアップを保証します。

+0

それで、接続文字列があなたのアプローチに使用するものは何ですか?

+0

私はユーザーIDとパスワードの部分を削除するだけです。しかし、PCにローカルにインストールした場合、Sql Server Expressは接続が期待通りに機能するはずです。私はこのコードのすべての部分が期待どおりの結果を返すかどうかを確認するためにデバッガを使用しようとします。特に、設定ファイルから接続文字列を読み取ろうとする部分です。 – Steve