我是否需要为每个命令使用try-catch?

时间:2015-04-27 07:47:53

标签: c# oledb

我有oledb连接。我使用try-catch,因为命令有时会出错。像这样:

    OleDbConnection Connection;
    Connection = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" +
               Server.MapPath("~/db.mdb"));
    OleDbCommand Command1, Command2, Command3;

    Command1 = new OleDbCommand("SELECT a FROM Table1 WHERE ID = 1", Connection);
    Command2 = new OleDbCommand("SELECT a FROM Table1 WHERE ID = 2", Connection);
    Command3 = new OleDbCommand("SELECT a FROM Table1 WHERE ID = 3", Connection);

try
{
    Connection.Open();
    var1= (int)Command1.ExecuteScalar();
    var2= (int)Command2.ExecuteScalar();
    var3= (int)Command3.ExecuteScalar();
    Connection.Close()
}
catch (Exception)
{
var1 = 2;
var2 = 24;
var3 = 55;
}

但是当我从Command1收到错误时,它会捕获并使用catch值。我在获取命令错误时需要使用catch值。因为例如Command2Command3正常工作。只是Command1收到错误。我可以对每个命令使用try-catch:

try
{
var1= (int)Command1.ExecuteScalar();
}
catch (Exception)
{
var1 = 2;
}
...

但是我有300-400个命令,我不能为每个命令使用try-catch(我可以这么努力)。如何使用catch来获取错误命令?

5 个答案:

答案 0 :(得分:3)

我希望你这个代码只是一个演示,而不是你的实际代码 这是如何不使用数据库的一个很好的例子。

快速而简单的解决方案是使用try catch块封装命令的执行。像这样的东西:

bool TryGetInt(OleDbCommand Command, int ValueIfException, out int Value) 
{
    try
    {
        if(Connection.State == ConnectionState.Closed || Connection.State == ConnectionState.Broken) 
        {
          Connection.Open();
        }
         Value = (int)Command1.ExecuteScalar();
         return true;
    }
    catch (Exception)
    {
         // Consider writing the exception into a log file
         Value = ValueIfException;
         return false;
    }
}

并将其称为:

TryGetInt(Command1, 2, out var1);
TryGetInt(Command2, 24, out var2);
....
Connection.Close();

请注意,我建议的函数返回一个布尔值来表示成功。

当然,您可以创建一个字典来保存带有失败值的命令,并使用foreach迭代它。

然而

我必须指出你应该重新考虑你的设计。 300个数据库调用方式 {300}在单个网站中进行过多的数据库调用,更不用说单个aspx页面了。

答案 1 :(得分:2)

你可以编写一个函数,将你的命令字符串和catch值作为参数,并在那里执行try / catch处理逻辑。

答案 2 :(得分:2)

您可以创建命令列表,在列表中添加每个命令,然后调用循环。像这样:

        OleDbConnection Connection;
        Connection = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=" +
                   Server.MapPath("~/db.mdb"));
        OleDbCommand Command1, Command2, Command3;

        List<OleDbCommand> commands = new List<OleDbCommand>();
        commands.Add(new OleDbCommand("SELECT a FROM Table1 WHERE ID = 1", Connection));
        commands.Add(new OleDbCommand("SELECT a FROM Table1 WHERE ID = 2", Connection));
        commands.Add(new OleDbCommand("SELECT a FROM Table1 WHERE ID = 3", Connection));

        Connection.Open();
        foreach (var command in commands)
        {
            try
            {
                var1= (int)Command.ExecuteScalar();
            }
            catch (Exception)
            {
                  // ...
            }
        }
        Connection.Close();

答案 3 :(得分:2)

您可以尝试以下内容。 2给出的选项。一个模板,以防你不仅处理int。但你会压制所有异常。这通常不是一个好主意。更好地捕捉特定的例外:

        OleDbCommand b = myCommand;
        int c = ExecuteScalarSuppressException(b, 24);
        int d = ExecuteScalarSuppressException<int>(b, 33);

    private static int ExecuteScalarSuppressException(OleDbCommand oleDbCommand, int defaultValue)
    {
        int returnValue = defaultValue;
        try
        {
            defaultValue = (int)oleDbCommand.ExecuteScalar();
        }
        catch (Exception)
        {
        }
        return defaultValue;
    }

    private static T ExecuteScalarSuppressException<T>(OleDbCommand oleDbCommand, T defaultValue)
    {
        T returnValue = defaultValue;
        try
        {
            defaultValue = (T)oleDbCommand.ExecuteScalar();
        }
        catch (Exception)
        {
        }
        return defaultValue;
    }

答案 4 :(得分:0)

如果您需要执行所有300/400命令,我宁愿有这样的事情:

for(int i=0;i<300;i++)
{
   Command1 = new OleDbCommand("SELECT a FROM Table1 WHERE ID = "+i, Connection);
   try{
       Connection.Open();
       var1= (int)Command1.ExecuteScalar();
   }catch(Exception e)
   {
        //your logic here
   }
}