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

Luk*_*and 3 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!");
                }
            }
Run Code Online (Sandbox Code Playgroud)

这会返回

无法打开Connection!"消息.

我在我的代码中得到以下显示:'System.Data.SqlClient.SqlException'System.Data.dll中出现类型异常,但未在用户代码中处理

附加信息:建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)

我知道我的服务器很好,因为我在SQL Server Management studio上连接了它并添加了表和数据.

smo*_*nes 7

你错过了几个 ;

conn.ConnectionString =
                    "Data Source = 123.456.789.012" +
                    ";Initial Catalog = DiscoverThePlanet" +
                    ";User ID = TestUser" +
                    ";Password = Test";
Run Code Online (Sandbox Code Playgroud)

更好的解决方案是使用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);
Run Code Online (Sandbox Code Playgroud)

或者(如@Fischermaen所述)您可以使用属性而不是索引.它更具可读性!

    builder.DataSource = "123.456.789.012";
    builder.InitialCatalog = "DiscoverThePlanet";
    builder.UserID = "TestUser";
    builder.Password = "Test";
Run Code Online (Sandbox Code Playgroud)

此外,在这种情况下,您不使用任何用户输入,但在手动创建连接字符串时要注意连接字符串注入.ConnectionStringBuilder可以帮助你避免这些.

当动态字符串连接用于构建基于用户输入的连接字符串时,可能会发生连接字符串注入攻击.如果未验证字符串且未转义恶意文本或字符,则攻击者可能会访问服务器上的敏感数据或其他资源.例如,攻击者可以通过提供分号并附加其他值来发起攻击.使用"last one wins"算法解析连接字符串,并使用恶意输入替换合法值.

连接字符串构建器类旨在消除猜测并防止语法错误和安全漏洞.它们提供与每个数据提供者允许的已知键/值对相对应的方法和属性.每个类都维护一个固定的同义词集合,并且可以从同义词转换为相应的众所周知的键名.对有效的键/值对执行检查,无效的对引发异常.此外,注入值以安全的方式处理.

最后一个(在我看来,最好的)替代方法是将您的connectionstring从代码移动到配置中.这将使您在不同环境中使用相同代码变得更加容易.

conn.ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString];
Run Code Online (Sandbox Code Playgroud)

和你的配置.

<connectionStrings>
    <add name="MyConnectionString" connectionString="[ConnectionString goes here]" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)