0

このコードをデバッグしようとすると、objConnection.Open() でエラーが発生します。

sqlExeption was Unhandled と言う (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 サーバーがオンになっていない場合に発生します。

localhost と (local) は、 sql server では異なる方法で処理されます。(ローカル)を試してみてください。

役立つ接続文字列のリストを次に示します。

SQL Express を使用している場合は、localhost から .\sqlexpress に変更することをお勧めします。

SQL Server がオンになっていることを確認するには、そのサービスがオンになっていることを確認してください。これは、サービスと構成マネージャーで行うことができます。

于 2010-09-11T14:22:39.993 に答える
1

まず第一に、を使用すると、自分SqlDataAdapterで特別に開閉する必要はありませんSqlConnection。アダプタが自動的にそれを行います。

using(.....) { .... }次に、ベストプラクティスとして、すべてのADO.NETコードをブロックに入れることを強くお勧めします。

さらに、ローカル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 に答える