c# SQL连接字符串返回错误
本文关键字:返回 错误 字符串 连接 SQL | 更新日期: 2023-09-27 18:03:02
嗨,我是新的,当它涉及到连接到服务器/数据库,并想知道为什么这返回一个错误。
我有一个带数据库的fastthost服务器。
我刚刚放入一个示例IP,但我一直在使用我在网站上的控制面板上给出的一个。
private void SQLTest_Click(object sender, RoutedEventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Data Source = 123.456.789.012" +
"Initial Catalog = DiscoverThePlanet" +
"User ID = TestUser" +
"Password = Test";
try
{
conn.Open();
MessageBox.Show("Connection Established!");
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Can not open Connection!");
}
}
返回
不能打开连接!"消息。
我得到以下显示在我的代码:在System.Data.dll中出现了'System.Data.SqlClient.SqlException'
类型的异常,但没有在用户代码
附加信息:在建立到SQL Server的连接时发生与网络相关或特定实例的错误。未找到服务器或无法访问服务器。验证实例名是否正确,SQL Server是否配置为允许远程连接。(提供程序:Named Pipes提供程序,错误:40 -无法打开到SQL Server的连接)
我知道我的服务器是好的,因为我已经连接到它的SQL server管理工作室和添加表和数据。
你错过了几个;
conn.ConnectionString =
"Data Source = 123.456.789.012" +
";Initial Catalog = DiscoverThePlanet" +
";User ID = TestUser" +
";Password = Test";
一个更好的解决方案是使用ConnectionStringBuilder
。
System.Data.SqlClient.SqlConnectionStringBuilder builder =
new System.Data.SqlClient.SqlConnectionStringBuilder();
builder["Data Source"] = "123.456.789.012";
builder["Initial Catalog"] = "DiscoverThePlanet";
builder["User ID"] = "TestUser";
builder["Password"] = "Test";
Console.WriteLine(builder.ConnectionString);
或者(正如@Fischermaen提到的)你可以使用属性,而不是索引。它甚至更可读!
builder.DataSource = "123.456.789.012";
builder.InitialCatalog = "DiscoverThePlanet";
builder.UserID = "TestUser";
builder.Password = "Test";
同样,在这个场景中,您不使用任何用户输入,但是在手动创建连接字符串时要注意连接字符串注入。ConnectionStringBuilder
可以帮助您避免这些。
动态字符串时,会发生连接字符串注入攻击连接用于构建基于的连接字符串用户输入。如果字符串未经过验证并且恶意文本或未转义的字符,攻击者可能访问敏感服务器上的数据或其他资源。例如,攻击者可以发起攻击,提供分号并附加附加的价值。使用"最后一个获胜"来解析连接字符串。算法,恶意输入被替换为合法的价值。
连接字符串构建器类旨在消除猜测和防止语法错误和安全性漏洞。的方法和属性每个数据提供程序允许的已知键/值对。每个类维护一个固定的同义词集合,并且可以从对应的知名密钥名的同义词。执行检查对于有效的键/值对,无效的键/值对抛出异常。在此外,注入的值以安全的方式处理。
最后(在我看来,最好的)选择是将您的connectionstring从代码移动到配置中。这将使您更容易在不同的环境中使用相同的代码。
conn.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString];
和你的配置。
<connectionStrings>
<add name="MyConnectionString" connectionString="[ConnectionString goes here]" providerName="System.Data.SqlClient" />
</connectionStrings>
在连接字符串代码的每个部分后面添加分号:
private void SQLTest_Click(object sender, RoutedEventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Data Source = 123.456.789.012;" +
"Initial Catalog = DiscoverThePlanet;" +
"User ID = TestUser;" +
"Password = Test";
try
{
conn.Open();
MessageBox.Show("Connection Established!");
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Can not open Connection!");
}
}
https://www.connectionstrings.com/sql-server/应该告诉你更多正确的格式
您的connectionstring格式不正确,您忘记了一些;
:
"Data Source = 123.456.789.012;Initial Catalog = DiscoverThePlanet;User ID = TestUser;Password = Test"
示例:
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
https://www.connectionstrings.com/sql-server/缺少一些';'。试试这个:
conn.ConnectionString =
"Data Source = 123.456.789.012;" +
"Initial Catalog = DiscoverThePlanet;" +
"User ID = TestUser;" +
"Password = Test;";
使用StringBuilder如果你想写ConnectionString像上面提到的,
字符串对象,每次都会占用内存。
StringBuilder将只占用一次内存,因此它将为提供更好的性能。
SqlConnection conn = new SqlConnection();
StringBuilder sb=new StringBuilder();
sb.Append("Data Source = 123.456.789.012;");
sb.Append("Initial Catalog = DiscoverThePlanet;");
sb.Append("User ID = TestUser;");
sb.Append("Password = Test;");
conn.ConnectionString =sb.ToString();
try
{
conn.Open();
MessageBox.Show("Connection Established!");
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Can not open Connection!");
}
连接字符串中缺少半列。所以改正
private void SQLTest_Click(object sender, RoutedEventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Data Source = 123.456.789.012;" +
"Initial Catalog = DiscoverThePlanet;" +
"User ID = TestUser;" +
"Password = Test;";
try
{
conn.Open();
MessageBox.Show("Connection Established!");
conn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Can not open Connection!");
}
}