.Net Core连接字符串Dapper Visual Studio 2017

7

我正在尝试在我的 .Net Core 应用程序中设置连接字符串,但是一直出现以下错误:

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;"
}

我之前也尝试使用像.Net Core之前一样的web.config:

<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连接字符串?

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

从App.config获取连接字符串

但是我漏掉了什么。我只设置过一次连接字符串,而且不是在.Net Core中,所以对其他人来说可能很明显。


你在哪一行遇到了错误?哪个对象是“NULL”? - Shyju
.NET Core在配置方面有所不同。你有一个appsettings.json文件吗?推荐的方式是将appsettings加载到你的IConfigurationRoot对象中,并将其注入到你的类中,然后从那里获取连接字符串。 - Jonesopolis
@Shyju 我在C#代码的以下行中得到了对象为空的错误:using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["Analysis"].ConnectionString)) - JoeG
@Jonesopolis 我确实尝试将连接字符串添加到appsettings.json中,就像我上面的代码所示。但我还没有尝试通过IConfigurationRoot加载它。 - JoeG
@Jonesopolis,我需要使用Options Pattern来完成这个吗? - JoeG
显示剩余2条评论
1个回答

7
如果您正在使用appsettings.json,请创建一个简单的POCO类来模拟您的连接字符串配置,就像这样:
public class ConnectionConfig
{
        public string Analysis {get;set;}
}

在Startup.cs文件的ConfigureServices方法中添加这行代码。
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;
   }
}

在您的控制器构造函数中注入 IOptions<ConnectionConfig>
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(); 
     }
 }

1
你也可以在控制器的构造函数中注入IOptions,并像我为YourClass所做的那样执行相同的操作。 - Yared
现在已经添加了IOptions控制器实现。 - Yared
我正在处理这个问题,但是使用你的实现后,我仍然遇到了错误:“无法将 'string' 转换为 IOptions<ConnectionConfig>”,具体位置在这里:_testing = new DataBaseData(connectionString) - JoeG
你确定要添加这行代码吗,string connectionString = connection.Analysis;?请展示你的实现。从上述代码片段中很难找到错误。 - Yared
是的,我已经添加了那行代码。 - JoeG
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接