天道酬勤,学无止境

如何在.NET Core中读取连接字符串?(How to read connection string in .NET Core?)

问题

我只想从配置文件中读取连接字符串,为此向我的项目中添加一个名称为“ appsettings.json”的文件,并在其上添加以下内容:

{
"ConnectionStrings": {
  "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-

 WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
    "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
    "Default": "Debug",
    "System": "Information",
    "Microsoft": "Information"
   }
 }
}

在ASP.NET上,我使用了以下方法:

 var temp=ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

现在如何在C#中读取“ DefaultConnection”并将其存储在.NET Core中的字符串变量中?

回答1

您可以使用GetConnectionString扩展方法执行此操作:

string conString = Microsoft
   .Extensions
   .Configuration
   .ConfigurationExtensions
   .GetConnectionString(this.Configuration, "DefaultConnection");

System.Console.WriteLine(conString);

或具有DI的结构化类:

public class SmtpConfig
{
    public string Server { get; set; }
    public string User { get; set; }
    public string Pass { get; set; }
    public int Port { get; set; }
}

启动:

public IConfigurationRoot Configuration { get; }


// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // http://developer.telerik.com/featured/new-configuration-model-asp-net-core/
    // services.Configure<SmtpConfig>(Configuration.GetSection("Smtp"));
    Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<SmtpConfig>(services, Configuration.GetSection("Smtp"));

然后在家庭控制器中:

public class HomeController : Controller
{

    public SmtpConfig SmtpConfig { get; }
    public HomeController(Microsoft.Extensions.Options.IOptions<SmtpConfig> smtpConfig)
    {
        SmtpConfig = smtpConfig.Value;
    } //Action Controller


    public IActionResult Index()
    {
        System.Console.WriteLine(SmtpConfig);
        return View();
    }

在appsettings.json中具有以下内容:

"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true"
},

"Smtp": {
    "Server": "0.0.0.1",
    "User": "user@company.com",
    "Pass": "123456789",
    "Port": "25"
  }
回答2

发布的答案很好,但是没有直接回答关于读取连接字符串的相同问题。 通过大量搜索,我发现了一种更简单的方法。

在Startup.cs中

public void ConfigureServices(IServiceCollection services)
{
    ...
    // Add the whole configuration object here.
    services.AddSingleton<IConfiguration>(Configuration);
}

在您的控制器中,为构造器添加一个字段,并在构造函数中为其添加一个参数

private readonly IConfiguration configuration;

public HomeController(IConfiguration config) 
{
    configuration = config;
}

现在,稍后在您的视图代码中,您可以像这样访问它:

connectionString = configuration.GetConnectionString("DefaultConnection");
回答3

请参阅链接以获取更多信息:https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/connection-strings

JSON格式

    {
      "ConnectionStrings": {
        "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
      },
    }

C#Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BloggingContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}

编辑:aspnetcore,从3.1开始:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view = aspnetcore-3.1

回答4

我发现解决此问题的方法是在Startup的构建器中使用AddJsonFile(允许它查找存储在appsettings.json文件中的配置),然后使用它来设置私有_config变量

public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        _config = builder.Build();
    }

然后,我可以将配置字符串设置如下:

var connectionString = _config.GetConnectionString("DbContextSettings:ConnectionString"); 

这是在dotnet core 1.1上

回答5

ASP.NET Core在我的情况下为3.1 )向我们提供了到Controllers的构造函数注入,因此您可以简单地添加以下构造函数:

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
    private readonly IConfiguration m_config;

    public TestController(IConfiguration config)
    {
        m_config = config;
    }

    [HttpGet]
    public string Get()
    {
        //you can get connection string as follows
        string connectionString = m_config.GetConnectionString("Default")
    }
}

这里的appsettings.json可能看起来像:

{
    "ConnectionStrings": {
        "Default": "YOUR_CONNECTION_STRING"
        }
}
回答6

还有另一种方法。 在我的示例中,您看到了存储库类中的一些业务逻辑,这些逻辑与ASP.NET MVC Core 3.1中的依赖项注入一起使用。

在这里,我想获取用于该业务逻辑的connectiongString ,因为可能另一个存储库将完全可以访问另一个数据库。

这种模式使您可以在同一业务逻辑存储库中访问不同的数据库。

C#

public interface IStatsRepository
{
            IEnumerable<FederalDistrict> FederalDistricts();
}

class StatsRepository : IStatsRepository
{
   private readonly DbContextOptionsBuilder<EFCoreTestContext>
                optionsBuilder = new DbContextOptionsBuilder<EFCoreTestContext>();
   private readonly IConfigurationRoot configurationRoot;

   public StatsRepository()
   {
       IConfigurationBuilder configurationBuilder = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
           .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
       configurationRoot = configurationBuilder.Build();
   }

   public IEnumerable<FederalDistrict> FederalDistricts()
   {
        var conn = configurationRoot.GetConnectionString("EFCoreTestContext");
        optionsBuilder.UseSqlServer(conn);

        using (var ctx = new EFCoreTestContext(optionsBuilder.Options))
        { 
            return ctx.FederalDistricts.Include(x => x.FederalSubjects).ToList();
        }
    }
}

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "EFCoreTestContext": "Data Source=DESKTOP-GNJKL2V\\MSSQLSERVER2014;Database=Test;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}
回答7

这是我的方法:

我在appsettings.json中添加了连接字符串

"ConnectionStrings": {
"conStr": "Server=MYSERVER;Database=MYDB;Trusted_Connection=True;MultipleActiveResultSets=true"},

我创建了一个名为SqlHelper的类

public class SqlHelper
{
    //this field gets initialized at Startup.cs
    public static string conStr;

    public static SqlConnection GetConnection()
    {
        try
        {
            SqlConnection connection = new SqlConnection(conStr);
            return connection;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }
}

在Startup.cs上,我使用ConfigurationExtensions.GetConnectionString来获取连接,并将其分配给SqlHelper.conStr。

public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        SqlHelper.connectionString = ConfigurationExtensions.GetConnectionString(this.Configuration, "conStr");
    }

现在,无论您在何处需要连接字符串,都可以像这样调用它:

SqlHelper.GetConnection();
回答8

我有一个可以同时使用.net核心和.net框架的数据访问库。

技巧是在.net核心项目中,将连接字符串保存在名为“ app.config”的xml文件中(也适用于Web项目),并将其标记为“复制到输出目录”,

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="conn1" connectionString="...." providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

ConfigurationManager.ConnectionStrings-将读取连接字符串。

    var conn1 = ConfigurationManager.ConnectionStrings["conn1"].ConnectionString;
回答9

在3.1中,已经为“ ConnectionStrings”定义了一个部分

System.Configuration.ConnnectionStringSettings

定义

  "ConnectionStrings": {
    "ConnectionString": "..."
  }

注册

public void ConfigureServices(IServiceCollection services)
{
     services.Configure<ConnectionStringSettings>(Configuration.GetSection("ConnectionStrings"));
}

注入

public class ObjectModelContext : DbContext, IObjectModelContext
{

     private readonly ConnectionStringSettings ConnectionStringSettings;

    ...

     public ObjectModelContext(DbContextOptions<ObjectModelContext> options, IOptions<ConnectionStringSettings> setting) : base(options)
    {
          ConnectionStringSettings = setting.Value;
    }

    ...
}

用途

   public static void ConfigureContext(DbContextOptionsBuilder optionsBuilder, ConnectionStringSettings connectionStringSettings)
    {
        if (optionsBuilder.IsConfigured == false)
        {
            optionsBuilder.UseLazyLoadingProxies()
                          .UseSqlServer(connectionStringSettings.ConnectionString);
        }
    }
回答10

为时已晚,但是在阅读了所有有用的答案和评论后,我最终使用了Microsoft.Extensions.Configuration.Binder扩展包,并进行了一些尝试以摆脱硬编码的配置键。

我的解决方案:

IConfigSection.cs

public interface IConfigSection
{
}

ConfigurationExtensions.cs

public static class ConfigurationExtensions
{
    public static TConfigSection GetConfigSection<TConfigSection>(this IConfiguration configuration) where TConfigSection : IConfigSection, new()
    {
        var instance = new TConfigSection();
        var typeName = typeof(TConfigSection).Name;
        configuration.GetSection(typeName).Bind(instance);

        return instance;
    }
}

appsettings.json

{
   "AppConfigSection": {
      "IsLocal": true
   },
   "ConnectionStringsConfigSection": {
      "ServerConnectionString":"Server=.;Database=MyDb;Trusted_Connection=True;",
      "LocalConnectionString":"Data Source=MyDb.db",
   },
}

要访问强类型的配置,您只需要为此创建一个类即可实现IConfigSection接口(注意:类名和字段名应与appsettings.json中的section完全匹配)

AppConfigSection.cs

public class AppConfigSection: IConfigSection
{
    public bool IsLocal { get; set; }
}

ConnectionStringsConfigSection.cs

public class ConnectionStringsConfigSection : IConfigSection
{
    public string ServerConnectionString { get; set; }
    public string LocalConnectionString { get; set; }

    public ConnectionStringsConfigSection()
    {
        // set default values to avoid null reference if
        // section is not present in appsettings.json
        ServerConnectionString = string.Empty;
        LocalConnectionString = string.Empty;
    }
}

最后是一个用法示例:

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        // some stuff

        var app = Configuration.GetConfigSection<AppConfigSection>();
        var connectionStrings = Configuration.GetConfigSection<ConnectionStringsConfigSection>();

        services.AddDbContext<AppDbContext>(options =>
        {
            if (app.IsLocal)
            {
                options.UseSqlite(connectionStrings.LocalConnectionString);
            }
            else
            {
                options.UseSqlServer(connectionStrings.ServerConnectionString);
            }
        });

        // other stuff
    }
}

为了使它整洁,可以将上面的代码移到扩展方法中。

就是这样,没有硬编码的配置密钥。

回答11

您可以使用配置扩展方法:getConnectionString(“ DefaultConnection”)

https://docs.asp.net/projects/api/zh/latest/autoapi/Microsoft/Extensions/Configuration/ConfigurationExtensions/index.html#Microsoft.Extensions.Configuration.ConfigurationExtensions.GetConnectionString

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在.net中以编程方式设置连接字符串?(How do I set a connection string config programmatically in .net?)
    问题 我想以编程方式设置连接字符串,而绝对不更改任何配置文件/注册表项。 我有这段代码,但是不幸的是,它抛出了“配置为只读”异常。 ConfigurationManager.ConnectionStrings.Clear(); string connectionString = "Server=myserver;Port=8080;Database=my_db;..."; ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings("MyConnectionStringKey", connectionString); ConfigurationManager.ConnectionStrings.Add(connectionStringSettings); 编辑:问题是我有从配置读取连接字符串的现有代码。 因此,手动或通过资源设置配置字符串似乎不是有效的选项。 我真正需要的是一种以编程方式修改配置的方法。 回答1 我已经在博客上的帖子中对此进行了撰写。 诀窍是使用反射来戳值,以获取对非公共字段(和方法)的访问。 例如。 var settings = ConfigurationManager.ConnectionStrings[ 0 ]; var fi = typeof(
  • 是什么导致我的java.net.SocketException:连接重置? [复制](What's causing my java.net.SocketException: Connection reset? [duplicate])
    问题 这个问题已经在这里有了答案: java.net.SocketException:连接重置(10个答案) 1年前关闭。 我们看到频繁但间歇性的java.net.SocketException: Connection reset错误在日志中。 我们不确定Connection reset错误的真正来源以及调试方法。 该问题似乎与我们尝试发送的消息无关。 请注意,该消息不是connection reset by peer 。 关于此异常的典型原因是什么以及如何进行的任何建议? 这是一个代表性的堆栈跟踪( com.companyname.mtix.sms是我们的组件): java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:168) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read(BufferedInputStream.java:235) at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:77)
  • 如何解决ASP.NET与SQL Server之间的连接池问题?(How can I solve a connection pool problem between ASP.NET and SQL Server?)
    问题 最近几天,我们在网站上看到此错误消息的次数过多: “超时到期。在从池中获取连接之前已经过了超时时间。这可能是因为所有池化连接都在使用中,并且达到了最大池大小。 我们已经有一段时间没有在代码中进行任何更改了。 我修改了代码以检查没有关闭的打开的连接,但是发现一切都很好。 我该如何解决? 我需要编辑该池吗? 如何编辑该池的最大连接数? 高流量网站的建议值是多少? 更新: 我需要在IIS中编辑某些内容吗? 更新: 我发现活动连接数在15到31之间,并且我发现SQL Server中配置的最大允许连接数超过3200个连接,太多是31个,或者我应该在ASP.NET配置中编辑一些内容? 回答1 在大多数情况下,连接池问题与连接泄漏有关。 您的应用程序可能无法正确且一致地关闭其数据库连接。 当您保持连接打开状态时,它们将保持阻塞状态,直到.NET垃圾回收器通过调用Finalize()方法为您关闭它们为止。 您要确保确实关闭了连接。 例如,如果.Open和Close之间的代码引发异常,则以下代码将导致连接泄漏: var connection = new SqlConnection(connectionString); connection.Open(); // some code connection.Close(); 正确的方法是这样的: var connection = new
  • java.net.SocketException:连接重置(java.net.SocketException: Connection reset)
    问题 我在尝试从套接字读取时遇到以下错误。 我正在该InputStream上执行readInt() ,并且收到此错误。 仔细阅读文档,这表明连接的客户端部分关闭了连接。 在这种情况下,我是服务器。 我可以访问客户端日志文件,但它没有关闭连接,实际上,它的日志文件表明我正在关闭连接。 那么,有人知道为什么会这样吗? 还有什么要检查的? 当有本地资源可能达到阈值时,会出现这种情况吗? 我确实注意到我有以下几行: socket.setSoTimeout(10000); 就在readInt() 。 这是有原因的(长话短说),但出于好奇,在某些情况下这可能会导致所指示的错误? 我在IDE中运行服务器,但碰巧我的IDE停留在断点上,然后我发现完全相同的错误开始出现在我自己的IDE日志中。 无论如何,仅提及它,希望它不会成为红色鲱鱼。 :-( 回答1 有几种可能的原因。 另一端故意重设了连接,在此我将不做记录。 应用程序软件很少这样做,而且通常是不正确的,但对于商业软件而言却并非未知。 更常见的是,由于写入连接而导致另一端已经正常关闭。 换句话说,应用程序协议错误。 当套接字接收缓冲区中有未读数据时,关闭套接字也会导致此错误。 在Windows中,“软件导致的连接中断”与“连接重置”不同,它是由您的终端发送的网络问题引起的。 有关于此的Microsoft知识库文章。 回答2
  • 在C#类库中使用IConfiguration(Using IConfiguration in C# Class Library)
    问题 我正在使用C#和Core .NET构建类库。 我正在尝试使用config.json文件中的配置。 这是该文件的内容: config.json { "emailAddress":"someone@somewhere.com" } 为了尝试使用config.json进行配置,我在我的project.json文件中引用了Microsoft.Framework.ConfigurationModel.Json 。 在我的代码中,我具有以下内容: MyClass.cs using Microsoft.Framework.ConfigurationModel; public class MyClass { public string GetEmailAddress() { // return ConfigurationManager.AppSettings["emailAddress"]; This is the approach I had been using since .NET 2.0 return ?; // What goes here? } } 从.NET 2.0开始,我一直在使用ConfigurationManager.AppSettings["emailAddress"] 。 但是,我现在正在尝试学习如何通过IConfiguration以新方式进行操作。 我的问题是
  • Python自动化运维实战:使用Python管理网络设备
    现在,我们已经知道如何在不同的操作系统中使用和安装Python以及如何使用EVE-NG搭建网络拓扑。在本章中,我们将学习如何使用目前常用的网络自动化库自动完成各种网络任务。Python可以在不同的网络层上与网络设备进行交互。 首先,Python可以通过套接字编程和socket模块操纵底层网络,从而为Python所在的操作系统和网络设备之间搭建一个低层次的网络接口。此外,Python模块还可以通过Telnet、SSH和API与网络设备进行更高级别的交互。本章将深入探讨如何在Python中使用Telnet与SSH模块在远程设备上建立连接和执行命令。 本章主要介绍以下内容: 使用Python通过Telnet连接设备;Python和SSH;使用netaddr处理IP地址和网络;网络自动化实战示例。 1 技术要求 应检查是否正确安装了下列工具并保证它们能够正常使用: Python 2.7.1x;PyCharm社区版或专业版;EVE-NG,网络仿真器的安装和配置请参阅第3章。 本章中出现的所有脚本请参见GitHub网站。 1.1 Python和SSH SSH和Telnet的不同之处在于客户端与服务器之间交换数据的通道不一样。SSH使用的是安全链路,在客户端和设备之间创建了一个使用不同的安全机制进行加密的隧道,通信内容很难被解密。因此在需要保证网络安全的时候,网络工程师会首先选择使用SSH协议。
  • 如何在ASP.NET CORE中获取客户端IP地址?(How do I get client IP address in ASP.NET CORE?)
    问题 您能否让我知道使用MVC 6时如何在ASP.NET中获取客户端IP地址Request.ServerVariables["REMOTE_ADDR"]不起作用。 回答1 API已更新。 不确定何时更改,但是根据Damien Edwards的说法,在12月下旬,您现在可以执行以下操作: var remoteIpAddress = request.HttpContext.Connection.RemoteIpAddress; 回答2 在project.json中添加一个依赖项: "Microsoft.AspNetCore.HttpOverrides": "1.0.0" 在Startup.cs的Configure()方法中,添加: app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }); 而且当然: using Microsoft.AspNetCore.HttpOverrides; 然后,我可以使用以下命令获取ip: Request.HttpContext.Connection.RemoteIpAddress 就我而言,在VS中进行调试时
  • 如何使用C#从Excel文件读取数据(How to read data from excel file using c# [duplicate])
    问题 这个问题已经在这里有了答案: 从C#读取Excel文件(32个答案) 7年前关闭。 我的应用程序需要从excel文件中读取数据。 我正在使用.Net和c#进行开发。 我无法在系统中安装MS Office。 因此,我的应用程序无法读取excel文件,并在为excel加载dll时抛出错误。 在未安装ms office的系统中,如何访问应用程序中的excel文件? 回答1 可以选择使用OleDB并使用Excel表格(例如数据库中的数据表)... 只是一个例子…… string con = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\test.xls;" + @"Extended Properties='Excel 8.0;HDR=Yes;'"; using(OleDbConnection connection = new OleDbConnection(con)) { connection.Open(); OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection); using(OleDbDataReader dr = command.ExecuteReader()) { while(dr.Read()) { var
  • 如何使用Jersey 2.x设置连接并读取超时?(How to set the connection and read timeout with Jersey 2.x?)
    问题 在jersey 1中,我们在com.sun.jersey.api.client.Client类中具有一个setConnectTimeout函数。 在jersey 2中,缺少此功能的地方使用javax.ws.rs.client.Client类。 如何在jersey 2.x中设置连接超时并读取超时? 回答1 下面的代码在Jersey 2.3.1中对我有用(灵感在这里找到:https://stackoverflow.com/a/19541931/1617124) public static void main(String[] args) { Client client = ClientBuilder.newClient(); client.property(ClientProperties.CONNECT_TIMEOUT, 1000); client.property(ClientProperties.READ_TIMEOUT, 1000); WebTarget target = client.target("http://1.2.3.4:8080"); try { String responseMsg = target.path("application.wadl").request().get(String.class); System.out.println(
  • 如何在单个SQL连接中运行多个SQL命令?(How to run multiple SQL commands in a single SQL connection?)
    问题 我正在创建一个项目,在该项目中,我需要在一个SQL连接中运行2-3个SQL命令。 这是我编写的代码: SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\project.mdf;Integrated Security=True"); con.Open(); SqlCommand cmd = new SqlCommand("select * from " + mytags.Text + " ", con); SqlDataReader rd = cmd.ExecuteReader(); if (rd.Read()) { con.Close(); con.Open(); SqlCommand cmd1 = new SqlCommand("insert into " + mytags.Text + " values ('fname.lname@gmail.com','" + TextBox3.Text + "','" + TextBox4.Text + "','" + TextBox5.Text + "','"+mytags.Text+"')", con); cmd1.ExecuteNonQuery(); label.Visible
  • 如何在Entity Framework Core中运行存储过程?(How to run stored procedures in Entity Framework Core?)
    问题 我在ASP.NET Core应用程序中使用EF Core 1.0。 您能给我指出执行存储过程的正确方法吗? 具有ObjectParameters和((IObjectContextAdapter)this).ObjectContext.ExecuteFunction的旧方法无法正常工作。 回答1 现在解决了EF Core 1.0中对存储过程的支持,它还支持多个结果集的映射。 在此处查看修复详细信息 您可以在c#中这样称呼它 var userType = dbContext.Set().FromSql("dbo.SomeSproc @Id = {0}, @Name = {1}", 45, "Ada"); 回答2 EF7中尚未实现存储过程支持(自7.0.0-beta3起)。 您可以使用问题#245跟踪此功能的进度。 现在,您可以使用ADO.NET以老式的方式进行操作。 var connection = (SqlConnection)context.Database.AsSqlServer().Connection.DbConnection; var command = connection.CreateCommand(); command.CommandType = CommandType.StoredProcedure; command.CommandText =
  • 什么是C#.NET中的App.config? 如何使用它?(What is App.config in C#.NET? How to use it?)
    问题 我已经在C#.NET中完成了一个项目,其中我的数据库文件是Excel工作簿。 由于在我的编码中对连接字符串的位置进行了硬编码,因此将其安装在我的系统中没有问题,但是对于其他系统而言,则存在问题。 应用程序设置完成后,是否有办法提示用户设置路径? 我得到的答案是“使用App.Config” ...谁能在这里告诉我什么是App.config以及如何在我的上下文中使用它? 回答1 最简单的说,app.config是一个XML文件,其中包含许多可用的预定义配置部分,并且支持自定义配置部分。 “配置部分”是XML的代码段,其中包含用于存储某种类型的信息的模式。 概述(MSDN) 连接字符串配置(MSDN) 可以使用诸如connectionStrings或appSettings类的内置配置节来配置设置。 您可以添加自己的自定义配置部分; 这是一个高级主题,但是对于构建强类型的配置文件非常有用。 Web应用程序通常具有web.config,而Windows GUI /服务应用程序具有app.config文件。 应用程序级配置文件从全局配置文件(例如machine.config)继承设置。 从App.Config中读取 连接字符串具有可以使用的预定义架构。 请注意,这个小片段实际上是有效的app.config(或web.config)文件: <?xml version="1.0"?>
  • 连接到Amazon RDS Oracle实例时如何解决“读取调用中减去一个”错误(How to approach a “Got minus one from a read call” error when connecting to an Amazon RDS Oracle instance)
    问题 我正在Amazon RDS实例上运行Oracle 11GR2。 偶尔会出现IO Error: Got minus one from a read call对DriverManager.getConnection(getUrl())进行IO Error: Got minus one from a read call时, IO Error: Got minus one from a read call ,我不确定为什么。 其他应用程序可以正常工作。 为了使事情更加混乱,该错误有时会自行纠正(在程序的下一次迭代之后)。 我应该如何处理“从读取呼叫中减去一个”错误? 完整堆栈跟踪: java.sql.SQLRecoverableException: IO Error: Got minus one from a read call at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553) at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254) at oracle.jdbc.driver
  • 动态更改Asp.Net Core中的连接字符串(Dynamically change connection string in Asp.Net Core)
    问题 我想在控制器中而不是在ApplicationDbContext中更改sql连接字符串。 我正在使用Asp.Net Core和Entity Framework Core。 例如: public class MyController : Controller { private readonly ApplicationDbContext _dbContext public MyController(ApplicationDbContext dbContext) { _dbContext = dbContext; } private void ChangeConnectionString() { // So, what should be here? } } 我怎样才能做到这一点? 回答1 我们有一个与您相似的案例。 我们要做的是在Startup类的ConfigureServices方法中使用IServiceCollection的实现工厂重载,如下所示: //First register a custom made db context provider services.AddTransient<ApplicationDbContextFactory>(); //Then use implementation factory to get the one you need
  • 如何找到MS SQL Server 2008的端口?(How to find the port for MS SQL Server 2008?)
    问题 我在本地计算机上运行MS SQL Server 2008。 我知道默认端口为1433,但是有些端口未在此端口监听。 SQL是Express版本。 我已经尝试使用日志,SQL Server Management Studio,注册表和扩展的存储过程来查找端口。 但是,我找不到它。 请帮我。 谢谢。 回答1 在Windows中单击“ Start按钮。 转到All Programs -> Microsoft SQL Server 2008 -> Configuration Tools -> SQL Server Configuration Manager 单击SQL Native Client 10.0 Configuration -> Client Protocols -> TCP/IP双击(右击选择Properties )上的TCP/IP 。 您会发现Default Port 1433 。 根据连接的不同,端口号可能会有所不同。 回答2 您也可以看一下 netstat -abn 它将为端口提供相应的应用程序,以使其保持打开状态。 编辑:或TCPView。 回答3 这是我发现的5种方法: 方法1:SQL Server配置管理器方法2:Windows事件查看器方法3:SQL Server错误日志方法4:sys.dm_exec_connections DMV 方法5:使用xp
  • MongoDB C#2.0 TimeoutException(MongoDB C# 2.0 TimeoutException)
    问题 我们最近已将Web应用程序升级到MongoDB C#Driver 2.0,并已部署到生产环境中。 在一定负载下,应用程序运行良好。 生产服务器上的负载超过特定限制后,应用程序的CPU立即降至0,大约30秒后,多次记录此异常: System.TimeoutException message: A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = ReadPreferenceServerSelector{ ReadPreference = { Mode = Primary, TagSets = System.Collections.Generic.List`1[MongoDB.Driver.TagSet] } }, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", Type : "Standalone", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint
  • com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通讯链接失败[重复](com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure [duplicate])
    问题 这个问题已经在这里有了答案: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败(39个答案) 4年前关闭。 我的连接到MySQL数据库的程序运行正常。 然后,在不更改用于建立连接的任何代码的情况下,我得到了以下异常: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 发生了什么? 用于获取连接的代码: private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException { String username = "user"; String password = "pass"; String url = "jdbc:mysql:/
  • 如何从巨大的表中读取所有行?(How to read all rows from huge table?)
    问题 我在处理数据库(PostgreSQL)中的所有行时遇到问题。 我收到一个错误: org.postgresql.util.PSQLException: Ran out of memory retrieving query results. 我认为我需要一小部分地读取所有行,但是它不起作用-它只能读取100行(下面的代码)。 怎么做? int i = 0; Statement s = connection.createStatement(); s.setMaxRows(100); // bacause of: org.postgresql.util.PSQLException: Ran out of memory retrieving query results. ResultSet rs = s.executeQuery("select * from " + tabName); for (;;) { while (rs.next()) { i++; // do something... } if ((s.getMoreResults() == false) && (s.getUpdateCount() == -1)) { break; } } 回答1 在PostgreSQL中使用CURSOR或让JDBC驱动程序为您处理。 处理大型数据集时,LIMIT和OFFSET会变慢。
  • 如何使用java.net.URLConnection触发和处理HTTP请求?(How to use java.net.URLConnection to fire and handle HTTP requests?)
    问题 在这里经常会问到使用java.net.URLConnection的情况,而Oracle教程对此却过于简洁。 该教程基本上仅显示如何触发GET请求并读取响应。 它没有任何地方说明如何使用它来执行POST请求,设置请求标头,读取响应标头,处理cookie,提交HTML表单,上传文件等。 因此,如何使用java.net.URLConnection来触发和处理“高级” HTTP请求? 回答1 首先是一个免责声明:发布的代码段都是基本示例。 您需要处理琐碎的IOException和RuntimeException例如NullPointerException , ArrayIndexOutOfBoundsException并进行自我组合。 准备中 我们首先至少需要知道URL和字符集。 参数是可选的,取决于功能要求。 String url = "http://example.com"; String charset = "UTF-8"; // Or in Java 7 and later, use the constant: java.nio.charset.StandardCharsets.UTF_8.name() String param1 = "value1"; String param2 = "value2"; // ... String query = String.format
  • 读取输入后无法写入输出(Cannot write output after reading input)
    问题 由于HttpURLConnection ,我正在编写一个连接到servlet的程序,但是在检查url时卡住了 public void connect (String method) throws Exception { server = (HttpURLConnection) url.openConnection (); server.setDoInput (true); server.setDoOutput (true); server.setUseCaches (false); server.setRequestMethod (method); server.setRequestProperty ("Content-Type", "application / xml"); server.connect (); /*if (server.getResponseCode () == 200) { System.out.println ("Connection OK at the url:" + url); System.out.println ("------------------------------------------- ------- "); } else System.out.println ("Connection failed"); }*/ 我得到了错误: