簡體   English   中英

C#SQL連接字符串返回錯誤

[英]C# SQL Connection String returning error

嗨,我是新的連接到服務器/數據庫,並想知道為什么這會返回一個錯誤。

我有一個帶數據庫的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.SqlClient.SqlException'出現類型'System.Data.SqlClient.SqlException'的異常,但未在用戶代碼中處理

附加信息:建立與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";

更好的解決方案是使用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可以幫助您避免這些。

當動態字符串連接用於構建基於用戶輸入的連接字符串時,可能會發生連接字符串注入攻擊。 如果未驗證字符串且未轉義惡意文本或字符,則攻擊者可能會訪問服務器上的敏感數據或其他資源。 例如,攻擊者可以通過提供分號並附加其他值來發起攻擊。 使用“last one wins”算法解析連接字符串,並使用惡意輸入替換合法值。

連接字符串構建器類旨在消除猜測並防止語法錯誤和安全漏洞。 它們提供與每個數據提供者允許的已知鍵/值對相對應的方法和屬性。 每個類都維護一個固定的同義詞集合,並且可以從同義詞轉換為相應的眾所周知的鍵名。 對有效的鍵/值對執行檢查,無效的對引發異常。 此外,注入值以安全的方式處理。

最后一個(在我看來,最好的)替代方法是將您的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/應該告訴您有關正確格式的更多信息。

你的連接字符串格式不正確,你忘了一些;

"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;";

如果你想像提一樣寫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!");
}

連接字符串中缺少半列。 所以糾正它

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM