14

I'm having a hard time figuring out how to get around the error with the below code. In this case below I want to return the datatable inside the catch as null.

    public static DataTable DTTable(string mysqlQuery, out DataTable DTTableTable)
    {
        try
        {
            MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
            DataDTTables.SelectCommand.CommandTimeout = 240000;
            DataTable DataDTTablesDT = new DataTable();
            DataDTTables.Fill(DataDTTablesDT);
            DTTableTable = DataDTTablesDT;
            EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
            return DTTableTable;

        }
        catch (Exception ex)
        {

            string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
            LoggingClass.GenericLogging(messageString);
        }

    }
2
  • Not a big deal, but I recommend changing your local variables to always start with lower-case letters, even if you intend to return them from the function. It makes it easier to tell that they are local variables. You've already doing that with messageString, for example. Commented Jul 24, 2011 at 22:14
  • 4
    Returning out parameter is quite silly, no offence meant. Why such design? Either have it as return value, or as out parameter. Commented Jul 24, 2011 at 22:16

7 Answers 7

34

In your catch block, add a return:

catch (Exception ex)
{
    // your code
    return null;
 }
8

You don't return anything after your catch block finishes execution.

You need to return some DataTable for that case.

public static DataTable DTTable(string mysqlQuery, out DataTable DTTableTable)
{
    DataTable result;
    try
    {
        MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
        DataDTTables.SelectCommand.CommandTimeout = 240000;
        DataTable DataDTTablesDT = new DataTable();
        DataDTTables.Fill(DataDTTablesDT);
        DTTableTable = DataDTTablesDT;
        EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
        result = DTTableTable;

    }
    catch (Exception ex)
    {
        string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
        LoggingClass.GenericLogging(messageString);
        result = null;
    }
    return result; //<--- executes even if an exception is thrown
}
1
  • It doesn't strictly have to be after the catch block completes. The OP could return inside the catch block, too (probably at the end of it). Of course your code also correctly solves the problem (and I prefer the one-return style, as you have written here). Commented Jul 24, 2011 at 22:17
2

If you want to return null inside the catch, then just return null inside the catch:

    catch (Exception ex)
    {
        string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
        LoggingClass.GenericLogging(messageString);
        return null;
    }
2
public static DataTable DTTable(string mysqlQuery, out DataTable DTTableTable)
{
    try
    {
       ....
    }
    catch (Exception ex)
    {
       ....
    }

    return null;
}
2

try

public static DataTable DTTable(string mysqlQuery, out DataTable DTTableTable)
    {
    DataTable Result = null;
    try
    {
    MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
    DataDTTables.SelectCommand.CommandTimeout = 240000;
    DataTable DataDTTablesDT = new DataTable();
    DataDTTables.Fill(DataDTTablesDT);
    DTTableTable = DataDTTablesDT;
    EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
    Result =  DataDTTablesDT;
    }
    catch (Exception ex)
    {
    string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
    LoggingClass.GenericLogging(messageString);
    }

return Result;
}

EDIT:

Version 1 (no out param because it is redundant):

public static DataTable DTTable(string mysqlQuery)
    {
    DataTable Result = null;
    try
    {
    MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
    DataDTTables.SelectCommand.CommandTimeout = 240000;
    DataTable DataDTTablesDT = new DataTable();
    DataDTTables.Fill(DataDTTablesDT);
    EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
    Result =  DataDTTablesDT;
    }
    catch (Exception ex)
    {
    string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
    LoggingClass.GenericLogging(messageString);
    }

return Result; }

Version 2 - not return Value (just out param):

public static void DTTable(string mysqlQuery, out DataTable DTTableTable)
    {
    DTTableTable = null;
    try
    {
    MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
    DataDTTables.SelectCommand.CommandTimeout = 240000;
    DataTable DataDTTablesDT = new DataTable();
    DataDTTables.Fill(DataDTTablesDT);
    EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
    DTTableTable = DataDTTablesDT;
    }
    catch (Exception ex)
    {
    string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
    LoggingClass.GenericLogging(messageString);
    }
}
1

Because the alternative code path is the catch block and you're not re-throwing the exception you still need to return either null or a DataTable.

You can do this in the catch block or right after it.

I'd also say that your out DataTable DTTableTable parameter in your DTTable method is redundant and unnecessary.

0

put simple return statement with null value .I hope this will solve your issue.