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 に答える