C#SQL连接字符串返回错误

时间:2016-08-19 11:17:58

标签: c# sql sql-server

嗨,我在连接到服务器/数据库时是新手,并且想知道为什么会返回错误。

我有一个带数据库的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上连接了它并添加了表和数据。

6 个答案:

答案 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 injectionConnectionStringBuilder可以帮助您避免这些。

  

动态字符串时可能发生连接字符串注入攻击   连接用于构建基于的连接字符串   用户输入。如果字符串未经过验证且是恶意文本或   角色未被转义,攻击者可能会访问敏感   服务器上的数据或其他资源。例如,攻击者可以   通过提供分号并附加一个分号来发动攻击   值。使用“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;

https://www.connectionstrings.com/sql-server/

答案 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!");
            }
        }