0

当我想调试此代码时,它会在 objConnection.Open() 上给出错误:

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

    SqlConnection objConnection = new SqlConnection(
"server=localhost;database=pubs;" +
"user id=sa;password=");
    SqlDataAdapter objDataAdapter = new SqlDataAdapter();
    DataSet objDataSet = new DataSet();
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Set the SelectCommand properties... 
        objDataAdapter.SelectCommand = new SqlCommand();
        objDataAdapter.SelectCommand.Connection =
              objConnection;
        objDataAdapter.SelectCommand.CommandText =
         "SELECT au_lname, au_fname, title, price " +
         "FROM authors " +
        "JOIN titleauthor ON authors.au_id = " +
        "titleauthor.au_id " +
         "JOIN titles ON titleauthor.title_id = " +
        "titles.title_id " +
         "ORDER BY au_lname, au_fname";
        objDataAdapter.SelectCommand.CommandType =
             CommandType.Text;
        // Open the database connection... 
        **objConnection.Open();**
        // Fill the DataSet object with data... 
        objDataAdapter.Fill(objDataSet, "authors");
        // Close the database connection... 
        objConnection.Close();
        // Set the DataGridView properties  
        // to bind it to our data... 
        grdAuthorTitles.AutoGenerateColumns = true;
        grdAuthorTitles.DataSource = objDataSet;
        grdAuthorTitles.DataMember = "authors";
        // Clean up 
        objDataAdapter = null;
        objConnection = null; 
    }
4

2 回答 2

3

当您的服务器名称错误或 sql server 未打开时,通常会发生此错误。

localhost 和 (local) 对于 sql server 的处理方式不同。您可能想尝试(本地)。

这是一个连接字符串列表,可以帮助您。

如果您使用的是 sql express,那么您可能希望将其从 localhost 更改为 .\sqlexpress。

要检查您的 SQL Server 是否已打开,请确保它的服务已打开。您可以在服务中执行此操作,也可以在配置管理器中执行此操作。

于 2010-09-11T14:22:39.993 回答
1

首先,使用SqlDataAdapter,您不需要专门打开和关闭SqlConnection自己 - 适配器会为您执行此操作。

其次,我强烈建议您将所有 ADO.NET 代码放入using(.....) { .... }块中作为最佳实践。

此外,在本地 PC 上,通常不需要为数据库指定特定用户,但可以integrated security=SSPI在 SQL 连接字符串中直接使用内置的 Windows 身份验证 ( )。

最后一件事:如果您不需要多个表DataSet,那么使用它会更容易和更好DataTable- 更少的开销,更少的性能损失。无需将表名指定为数据成员等。就简单多了。

试试这个代码:

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    using(SqlConnection objConnection = new SqlConnection("server=(local);database=pubs;integrated security=SSPI;"))
    {
        SqlDataAdapter objDataAdapter = new SqlDataAdapter();

        // Set the SelectCommand properties... 
        objDataAdapter.SelectCommand = new SqlCommand();
        objDataAdapter.SelectCommand.Connection = objConnection;
        objDataAdapter.SelectCommand.CommandText =
            "SELECT au_lname, au_fname, title, price FROM authors " +
            "JOIN titleauthor ON authors.au_id = titleauthor.au_id " +
            "JOIN titles ON titleauthor.title_id = titles.title_id " +
            "ORDER BY au_lname, au_fname";

        DataTable tblData = new DataTable();

        // Fill the DataSet object with data... 
        objDataAdapter.Fill(tblData);

        // Set the DataGridView properties  
        // to bind it to our data... 
        grdAuthorTitles.AutoGenerateColumns = true;
        grdAuthorTitles.DataSource = tblData;
   }
}

这样,引用类的处理将自动为您处理。

于 2010-09-11T14:33:48.677 回答