2017-09-13 59 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