嗨,我在连接到服务器/数据库时是新手,并且想知道为什么会返回错误。
我有一个带数据库的FastHost服务器。
我刚刚输入了一个IP示例,但我一直在使用网站控制面板上给出的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!");
}
}
返回
无法打开Connection!“消息。
我的代码中显示以下内容:
System.Data.dll中出现'System.Data.SqlClient.SqlException'
类型的异常,但未在用户代码中处理
其他信息:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)
我知道我的服务器很好,因为我在SQL Server Management studio上连接了它并添加了表和数据。
答案 0 :(得分:7)
你错过了几个;
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";
此外,在这种情况下,您没有使用任何用户输入,但在手动创建连接字符串时要小心connection string injection。 ConnectionStringBuilder
可以帮助您避免这些。
动态字符串时可能发生连接字符串注入攻击 连接用于构建基于的连接字符串 用户输入。如果字符串未经过验证且是恶意文本或 角色未被转义,攻击者可能会访问敏感 服务器上的数据或其他资源。例如,攻击者可以 通过提供分号并附加一个分号来发动攻击 值。使用“last one wins”解析连接字符串 算法,恶意输入代替合法 值。
连接字符串构建器类旨在消除 猜测并防止语法错误和安全 漏洞。它们提供了对应的方法和属性 每个数据提供者允许的已知键/值对。每节课 维护一个固定的同义词集合,可以从a翻译 相应的知名密钥名称的同义词。执行检查 对于有效的键/值对,无效的对抛出异常。在 此外,注入值以安全的方式处理。
最后一个(在我看来,最好的)替代方案是move your connectionstring from code into a config。这将使您在不同环境中使用相同代码变得更加容易。
conn.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString];
和你的配置。
<connectionStrings>
<add name="MyConnectionString" connectionString="[ConnectionString goes here]" providerName="System.Data.SqlClient" />
</connectionStrings>
答案 1 :(得分:2)
在连接字符串代码的每一部分后添加分号:
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/应该告诉您有关正确格式的更多信息。
答案 2 :(得分:2)
您的连接字符串格式不正确,您忘记了一些;
:
"Data Source = 123.456.789.012;Initial Catalog = DiscoverThePlanet;User ID = TestUser;Password = Test"
一个例子:
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
答案 3 :(得分:1)
有一些&#39 ;;&#39;失踪。试试这个:
conn.ConnectionString =
"Data Source = 123.456.789.012;" +
"Initial Catalog = DiscoverThePlanet;" +
"User ID = TestUser;" +
"Password = Test;";
答案 4 :(得分:0)
如果要编写像提及一样的ConnectionString,请使用 StringBuilder
String对象每次占用内存。
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!");
}
答案 5 :(得分:0)
连接字符串中缺少半列。所以纠正它
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!");
}
}