在从查询中恢复字符串值之前检查异常

本文关键字:检查 异常 字符串 查询 恢复 | 更新日期: 2023-09-27 18:37:00

我的函数导致很多异常,因此性能不是那么好。

您能否建议如何在我返回字符串之前修复函数并验证数据?我试图查看表的数量是否大于 0,但情况并非总是如此。

    public String getString(String sql)
    {
        DataSet ds = new DataSet();
        string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
        NpgsqlConnection conn = new NpgsqlConnection(connstring);
        try
        {
            conn.Open();
            NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
            ds.Reset();
            da.Fill(ds);           
            conn.Close();
            return ds.Tables.Count == 0 ? "0" : ds.Tables[0].Rows[0][0].ToString();
        }
        catch (Exception msg)
        {
            if (conn.State.ToString() == "Open")
            {
                conn.Close();
            }
            return "0";
        }
    }

在从查询中恢复字符串值之前检查异常

您应该使用 自动释放您创建的对象。您可以显式打开/关闭连接,但此处不需要它,因为行为将完全相同。如果未打开,DataAdapter 将打开连接,并记得在之后关闭它。

关于validate the data - 请参阅代码中的注释。

public String getString(String sql)
{
    using (DataSet ds = new DataSet())
    {
        string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
        using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
        {
            using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn))
            {
                da.Fill(ds);
                // You did check count of tables
                if (ds.Tables.Count > 0)
                {
                   DataTable dt = ds.Tables[0];
                   // But forgot to check count of Rows
                   if (dt.Rows.Count > 0)
                   {
                      object o = dt.Rows[0][0];
                      //  And returned value for nulls
                      //  Check for null is here because I don't know
                      //  This Postgresql classes
                      if (o != DBNull.Value && o != null)
                      {
                         return o.ToString();
                      }
                  }
              }
           }
        }
    }
    // Return default value
    return "0";
}

最后一件事 - 测试枚举时,不要将其转换为字符串。要查看连接是否已打开,只需说:

if (conn.State == ConnectionState.Open)

尝试使用"final"块。

此外,我建议将连接功能划分为其他方法,以便更好地控制异常发生的位置。

还可以将存储过程与 SQL 结合使用,以最大程度地减少 SQL 字符串的错误。

public String getString(String sql)
{
    DataSet ds = new DataSet();
    string connstring = String.Format("Server={0};Port={1}; User Id={2};Password={3};Database={4};", tbHost, tbPort, tbUser, tbPass, tbDataBaseName);
    NpgsqlConnection conn = new NpgsqlConnection(connstring);
    conn.Open();
    NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
    ds.Reset();
    try
    {
       da.Fill(ds);          
    }
    catch (Exception msg)
    {
        // do something here or log the error.
    }
    finally
    {
       if (conn.State.ToString() == "Open")
       {
            conn.Close();
       }
    }
    return ds.Tables.Count == 0 ? "0" : ds.Tables[0].Rows[0][0].ToString();
}