0

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

您能否建议在我返回字符串之前如何修复函数并验证数据?我试图查看表的数量是否超过 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";
        }
    }
4

3 回答 3

2

您应该使用using自动处理您创建的对象。您可能会显式打开/关闭连接,但这里不需要这样做,因为行为将完全相同。如果未打开 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)
于 2012-06-13T20:32:53.623 回答
1

也尝试使用“finally”块。

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

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

于 2012-06-13T19:28:07.170 回答
1
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();
}
于 2012-06-13T19:31:03.177 回答