嗨,我是新的连接到服务器/数据库,并想知道为什么这会返回一个错误.
我有一个带数据库的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上连接了它并添加了表和数据.
你错过了几个 ;
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)