我正在使用.NET Core和EF Core(均为v3.0)开发控制台应用程序;并且我需要使用从另一个类生成的字符串来启动DbContext。
DbContext文件
public Arta_LuniaDBContext() { }
public Arta_LuniaDBContext(DbContextOptions<Arta_LuniaDBContext> options) : base(options) { }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(DataServices.ConnectionString);
}
DataServices类
public static string ConnectionString { get { return GetConnectionData(); } }
private static string GetConnectionData()
{
/// Sets the Server name, Database, UserId and Password.
string Server, Database, UserId, Password;
/// Sets the separator.
string Separator = ";";
/// Connection string [internal].
string ArtaConn = null;
/// Loads Settings.xml
XmlDocument xDoc = new XmlDocument();
xDoc.Load("Settings.xml");
/// Gets the XmlNode: DataSource
XmlNodeList xSource = xDoc.GetElementsByTagName("DataSource");
for (int i = 0; i < xSource.Count; i++)
{
/// Sets the Server name.
Server = "Server=" + xSource[i].Attributes["Server"].Value + Separator;
/// Sets the Database.
Database = "Database=" + xSource[i].Attributes["Database"].Value + Separator;
/// Sets the User id.
UserId = "User id=" + xSource[i].Attributes["UserId"].Value + Separator;
/// Sets the Password.
Password = "Password=" + xSource[i].Attributes["Password"].Value + Separator;
/// Builds the connection string.
ArtaConn = Server + Database + UserId + Password;
Colorful.Console.WriteLine(ArtaConn, System.Drawing.Color.Yellow);
// I'm using this line to test the output.
}
/// Returns~
return ArtaConn;
}
Settings.xml
<!-- Sets the Database ConnectionString -->
<DataSource Server="IP_ADDRESS\\INSTANCE" Database="DbName" UserId="MyUser" Password="MyPassword" />
ConsoleWrite行将我的输出显示为:
Server=IP_ADDRESS\\INSTANCE;Database=DbName;User id=MyUser;Password=MyPassword;
这个字符串对我来说似乎还可以,但是,当我尝试连接数据库时,出现以下错误:
System.Data.SqlClient.SqlException(0x80131904):与网络相关或 建立与以下对象的连接时发生特定于实例的错误 SQL Server。服务器未找到或无法访问。校验 实例名称正确并且已将SQL Server配置为 允许远程连接。 (提供者:SQL网络接口,错误:26 -错误定位指定的服务器/实例)
如果我设置的话,会很奇怪
optionsBuilder.UseSqlServer("IP_ADDRESS\\INSTANCE;Database=DbName;User id=MyUser;Password=MyPassword;");
我可以毫无问题地连接...
有什么办法可以解决?预先感谢。
[编辑]修复它; 已更改:
<DataSource Server="IP_ADDRESS\\INSTANCE" Database="DbName" UserId="MyUser" Password="MyPassword" />
收件人:
<DataSource Server="IP_ADDRESS\INSTANCE" Database="DbName" UserId="MyUser" Password="MyPassword" />
答案 0 :(得分:1)
查看xml文件中反斜杠的使用情况。
在某些情况下,if
可以是转义的\,从字面上看,它是2个斜杠。
此代码说明了重点:这些字符串不相等。
\\
如果在localhost上尝试此操作,它是否可以按您期望的方式工作? 如果是这样,罪魁祸首就是。
您还可以查看是否可行。
String s= "Server=IP\\INSTANCE_NAME;Database=db;User id=User ;Password=pwd;";
String s2= @"Server=IP\\INSTANCE_NAME;Database=db;User id=User ;Password=pwd;";
Console.WriteLine(s2== s);
希望这会有所帮助!
答案 1 :(得分:0)
为工作使用正确的工具-SqlConnectionStringBuilder Class
Builder将转义反斜杠并为Sql Server连接构建正确的连接字符串。
var builder = new SqlConnectionStringBuilder
{
DataSource = @"IP_ADDRESS\INSTANCE",
InitialCatalog = "DbName",
UserID = "MyUserId",
Password = "MyPassword"
};
var connectionString = builder.ConnectionString;
// Use connection string
optionsBuilder.UseSqlServer(connectionString );
因此您的方法如下所示:
private SqlConnectionStringBuilder BuilderFromElement(XElement source)
{
return new SqlConnectionStringBuilder
{
DataSource = source.Attribute("Server")?.Value,
InitialCatalog = source.Attribute("Database")?.Value,
UserID = source.Attribute("UserID")?.Value,
Password = source.Attribute("Password")?.Value
};
}
private string GetConnectionString()
{
var settings = XDocument.Load("Settings.xml");
var allConnectionStrings =
settings.Descendants("DataSource")
.Select(BuilderFromElement)
.Select(builder => builder.ConnectionString)
return allConnectionStrings.FirstOrDefault();
}