C# 连接关闭异常
我是C#新手,正在尝试建立C#db连接。但我有个例外 ExecuteReader需要打开且可用的连接。连接的当前状态为关闭 下面是代码C# 连接关闭异常,c#,.net,exception,C#,.net,Exception,我是C#新手,正在尝试建立C#db连接。但我有个例外 ExecuteReader需要打开且可用的连接。连接的当前状态为关闭 下面是代码 public void executeCommand() { SqlConnection con = new SqlConnection(connectionString); try { con.Open(); } catch (Exception ex) { } SqlData
public void executeCommand()
{
SqlConnection con = new SqlConnection(connectionString);
try
{
con.Open();
}
catch (Exception ex)
{
}
SqlDataReader rdr = null;
SqlCommand cmd = new SqlCommand("SELECT * FROM Employees", con);
try
{
rdr = cmd.ExecuteReader();
}
catch (Exception)
{
throw;
}
rdr.Close();
// rdr.Close();
}
这是我的连接字符串
public static string connectionString =
"Data Source=(local);Initial Catalog=service;User Id='mayooresan';Password='password';";
提前感谢您的时间。打开连接时,您会发现任何异常。很可能连接未打开,正在抛出错误。在连接打开时删除try/catch,您可能会看到连接未打开的原因尝试将所有内容包装在一个try-catch块中。现在的情况是,如果在尝试打开连接时引发异常,它将无声地失败。请尝试以下代码:
try
{
SqlConnection con = new SqlConnection(connectionString);
SqlDataReader rdr = null;
SqlCommand cmd = new SqlCommand("SELECT * FROM Employees", con);
rdr = cmd.ExecuteReader();
}
catch(Exception)
{
throw;
}
你在调试代码吗? 如果没有,你将无法看到异常,因为你没有捕获任何东西 我还建议在您的场景中使用此方法:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(queryString, connection);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(String.Format("{0}", reader[0]));
}
}
当引发异常时,您不会关闭连接和读卡器,因此您需要使用try/catch的
finally
-块或隐式关闭的:
using (SqlConnection connection = new SqlConnection(connectionString))
{
using(SqlCommand command = new SqlCommand(queryString, connection)
{
connection.Open();
using(SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
// do something with it
}
}
}
}
除此之外,不应使用空的捕捉块。如果无法打开连接,则无法使用该连接。然后,您应该记录并抛出异常,但不要表现得好像什么都没发生过一样。大多数可能的连接对象无法打开连接,但当您捕获它时,您无法找出错误。要明确的是:
try
{
con.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString()); //ADD THIS STRING FOR DEBUGGING, TO SEE IF THERE IS AN EXCEPTION.
}
希望这有帮助。您不应该让try/catch块的catch部分没有任何内容。这是隐藏异常的最佳方法。始终至少使用Debug.writeline(ex);也许你的连接没有建立,它被静默地捕获,所以你看不到它……你应该从这段代码中删除所有的try/catch块。在第一个示例中,您正在接受异常。那是个糟糕的主意。异常包含有关出错原因的有用信息。我明确地忽略了有用的错误消息,您拒绝自己修复它们。第二个没有以任何方式处理异常,那么为什么要费心捕捉它呢?一般来说,只有在准备好处理异常时才能捕获该异常。如果上下文无法处理它,不要捕捉它。让它冒泡到父上下文。此外,使用可支配资源的语句(例如
SqlConnection
)查看。它基本上为您创建一个try/finally块,finally
块是处理此类资源的合适位置。否则,如果出现任何故障,应用程序中可能会出现资源泄漏。(请特别注意try/finally构造。并非每个try
都需要一个catch
。正如我前面所说,不需要捕获您不打算处理的异常。try
可以只有一个finally
来处理资源并相应地对事件做出反应。)或者,在这种情况下,只是根本不要使用try/catch块。由于没有处理异常,因此没有理由首先捕获它。这为他以后添加真正的错误处理留下了空间。您永远不应该留下可以随意抛出异常的代码谁说过“随意”呢?如果他想添加逻辑来处理异常,那么他可以稍后添加try/catch块。但是,捕获一个异常而只是重新抛出它而不做其他任何事情是绝对没有意义的。如果当前上下文中的代码无法处理异常,那么它不应该捕获异常。让异常冒泡到可以处理它的上下文。抛出异常并不是一件坏事。无缘无故地捕获它们是非常重要的。很明显,它无法打开的原因是:因为它从未关闭。这有助于感谢:)我有一个无效的连接字符串dat是isue:)