2017-09-13 57 views
3

我試圖得到一個連接字符串在我的.Net核心應用設置,但我不斷收到錯誤:核心網連接字符串小巧玲瓏的Visual Studio 2017年

System.NullReferenceException:「對象引用不設置到一個對象的實例'。

我已嘗試加入以下appsettings.json

"ConnectionStrings": { 

"Analysis": "Server=DESKTOP-MYSERVER;Database=MYDATABASE;User Id=sa; Password=Password123;Provider=System.Data.SqlClient;Trusted_Connection=True;MultipleActiveResultSets=true;Pooling=false;" 
} 

我使用的web.config還試圖像我以前的.Net核心之前:

<connectionStrings> 
<add name="Analysis" providerName="System.Data.SqlClient" 
    connectionString="Server=DESKTOP-MYSERVER;Database=MYDATABASE;User Id=sm;Password=Password123;"/> 

然後在c#中我有:

public List<DapperTest> ReadAll() 
    { 
     var data = new List<DapperTest>(); 
     using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["Analysis"].ConnectionString)) 
     { 
      data = db.Query<DapperTest>("select * from testTable").ToList(); 
     } 

     return data; 
    } 

兩種方式給我例外:

System.NullReferenceException:「對象引用未設置到對象的實例」

我用以下資源:

.Net CORE Dapper Connection String?

https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro

Get connection string from App.config

但我失去了一些東西。我只設置了一次連接字符串,它不在.Net Core中,因此對其他人可能很明顯。

+0

哪條線會出錯?什麼對象是'NULL'? – Shyju

+0

.NET內核的配置不同。你有'appsettings.json'嗎?推薦的方法是將appsettings加載到你的'IConfigurationRoot'對象中,並將它注入到你的類中,並從那裏獲取連接字符串 – Jonesopolis

+0

@Shyju我在c#代碼的下面一行中得到的對象爲null:'using( IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings [「Analysis」]。ConnectionString))' – Joe

回答

3

如果使用appsettings.json,創建一個簡單的POCO類連接字符串配置模型是這樣的:

public class ConnectionConfig 
{ 
     public string Analysis {get;set;} 
} 

在ConfigureServices方法添加此行Startup.cs

services.Configure<ConnectionConfig>(Configuration.GetSection("ConnectionStrings")); 

數據服務分類

class YourClass{ 
    private string _connectionString; 

    YourClass(string connectionString){ 
     _connectionString = connectionString; 
    } 

    //Your implementation 
    public List<DapperTest> ReadAll() 
    { 
     var data = new List<DapperTest>(); 
     using (IDbConnection db = new SqlConnection(_connectionString) 
     { 
      data = db.Query<DapperTest>("select * from testTable").ToList(); 
     } 

     return data; 
    } 
} 

Inject IOptions<ConnectionConfig> in you r控制器構造函數。

class YourController : Controller{ 
    YourClass _testing; 

    YourController(IOptions<ConnectionConfig> connectionConfig){ 
     var connection = connectionConfig.Value; 
     string connectionString = connection.Analysis; 
     _testing = new YourClass(connectionString); 
    } 
    public IActionResult Index() { 
     var testingData = _testing.ReadAll(); 
     return View(); 
    } 
} 
+0

這是一個巨大的幫助。一個簡單的後續問題,但是:當我在控制器中調用這個參數時(現在是什麼類型,因爲我不熟悉'IOptions'),我怎麼會傳入一個參數呢?例如,我會在這裏傳入什麼參數:'public IActionResult Index() { var testing = new YourClass(); var testingData = testing.ReadAll(); return View(); }' – Joe

+1

你也可以在你的控制器的構造函數中注入IOptions,並且像我爲YourClass一樣執行相同的操作 – Yared

+0

現在添加IOptions的控制器實現 – Yared