【初心者向け】C#/.NET/SQL Serverで「ExecuteReader requires an open and available Connection. The connection's current state is Connecting」エラーをバッチリ解決
C#, .NET, SQL Server における "ExecuteReader requires an open and available Connection. The connection's current state is Connecting" エラーの分かりやすい解説
このエラーは、C# で ADO.NET を使用して SQL Server に接続しようとした際に発生します。 ExecuteReader
メソッドを呼び出す前に、接続が開いて使用可能になっていないことが原因です。
原因
このエラーが発生する主な原因は以下の 2 つです。
- 接続が開かれていない:
SqlConnection
オブジェクトを作成してOpen()
メソッドを呼び出す前に、ExecuteReader
メソッドを呼び出している可能性があります。 - 接続がタイムアウトしている: 接続が確立された後、アイドル状態が長く続くと、サーバー側で接続が切断される場合があります。その後、
ExecuteReader
メソッドを呼び出すと、このエラーが発生します。
解決策
このエラーを解決するには、以下のいずれかの方法を試してください。
- 接続を開く:
ExecuteReader
メソッドを呼び出す前に、必ずSqlConnection
オブジェクトのOpen()
メソッドを呼び出して接続を開いてください。
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open(); // 接続を開く
using (SqlCommand command = new SqlCommand(queryString, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
// データ処理
}
}
}
SqlConnection
オブジェクトは、using
ステートメントを使用してスコープ内に確保することで、自動的に閉じることができます。- ADO.NET には、接続の状態を確認するためのプロパティが用意されています。例えば、
SqlConnection
オブジェクトのConnectionState
プロパティを使用して、接続が開いているかどうかを確認できます。
Sample code for "ExecuteReader requires an open and available Connection. The connection's current state is Connecting" error in C#, .NET, SQL Server
using System.Data.SqlClient;
public class Example
{
private static readonly string connectionString = "Data Source=localhost;Initial Catalog=MyDatabase;Integrated Security=True";
public static void Main()
{
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open(); // 接続を開く
string queryString = "SELECT * FROM Customers";
using (SqlCommand command = new SqlCommand(queryString, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
int customerId = reader.GetInt32(0);
string customerName = reader.GetString(1);
Console.WriteLine($"Customer ID: {customerId}, Customer Name: {customerName}");
}
}
}
}
}
catch (SqlException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
This code snippet demonstrates how to connect to a SQL Server database using ADO.NET and execute a SELECT query. The using
statements ensure that the SqlConnection
and SqlDataReader
objects are automatically disposed of when they go out of scope.
Key points
Additional notes
- This code assumes that the
Customers
table has two columns:CustomerID
(int) andCustomerName
(varchar). - You can modify the query and data processing logic according to your specific requirements.
- For more advanced scenarios, you may want to consider using connection pooling, parameterized queries, or stored procedures.
- Explicit connection management: Instead of relying on
using
statements for automatic disposal, you can explicitly manage the connection's lifetime. This gives you more control over when the connection is opened and closed.
SqlConnection connection = new SqlConnection(connectionString);
try
{
connection.Open(); // Open the connection explicitly
// Execute SQL commands here
}
catch (SqlException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
finally
{
if (connection.State != ConnectionState.Closed)
{
connection.Close(); // Close the connection if it's still open
}
}
c# .net sql-server