3

Oracleデータベースからデータを取得し、グリッドビューにデータを入力します。次に、クエリを実行してデータを選択しようとしましたが、エラーが発生します。コードは次のとおりです。

Db.cs:

public static OracleConnection GetConnection()
{
    OracleConnection connection = null;

    string connectionString = "Data Source=" + Database +
        ";User ID=" + UserID +
        ";Password=" + Password +
        ";Unicode=True";

    try
    {
        connection = new OracleConnection(connectionString);
    }
    catch (OracleException ex)
    {
        throw ex;
    }

    return connection;
}

パラメータはdefault.aspx.csから送信されます。

new Db(database, userID, password);
OracleConnection connection = Db.GetConnection();

main.aspx.csはすべてのデータを取得します。

private OracleConnection connection = new OracleConnection();
private Select select = new Select();

protected void Page_Load(object sender, EventArgs e)
{
    Response.Buffer = true;

    if (Db.IsLoggedIn())
    {
        string selectCommand = 
           "SELECT " + Settings.TABLE + ".* FROM " + Settings.TABLE + " ORDER BY ";
        foreach (string ob in Settings.OB) selectCommand += ob + ", ";

        Session["Error"] = null;
        connection = Db.GetConnection();

        select = new Select(ddlBubID, ddlBusArea, ddlDrillSite, ddlWell, connection);

        gvData.DataKeyNames = Settings.PK;
        gvData.SelectedIndex = -1;

        DS.ConnectionString = connection.ConnectionString;
        DS.SelectCommand = selectCommand.Remove(selectCommand.Length - 2, 2);
        DS.ProviderName = Settings.PROVIDER_NAME;

        PopulateFooter(gvData.FooterRow);
    }
    else
    {
        Session["Error"] = Settings.ERROR_MESSAGE[0, 0];
        Response.Clear();
        Response.Redirect("default.aspx");
    }
}

public string ToolTip(string column)
{
    string value = "";
    OracleCommand cmd = new OracleCommand();
    cmd.Connection = connection;
    cmd.CommandText = "SELECT DISTINCT COMMENTS " +
                      "FROM SYS.ALL_COL_COMMENTS " +
                      "WHERE (TABLE_NAME = 'CTD_PROBLEM_EDIT_V') " +
                      "AND (COLUMN_NAME = " + column + ")";
    cmd.CommandType = CommandType.Text;
    OracleDataReader reader = cmd.ExecuteReader(); // I get an error here
    reader.Read();
        value = reader["COMMENTS"].ToString();
    reader.Close();
    return value;
}

protected void gvData_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
        for (int i = 1; i < e.Row.Cells.Count; i++)
        {
            try
            {
                LinkButton lb =
                    (LinkButton)gvData.HeaderRow.Cells[i].Controls[0];
                lb.ToolTip = ToolTip(lb.Text);

                /* Blah Blah*/
            }
            catch { }

        }

    if (e.Row.RowType == DataControlRowType.Footer)
        PopulateFooter(e.Row);
}

ToolTip(); エラーをスローします:無効な操作。接続が閉じられます。

編集:

これは役に立ちました: 静的クラスと静的クラスメンバー

4

2 に答える 2

3

問題ではないかもしれませんが、これは奇妙に見えます:

new Db(database, userID, password);
OracleConnection connection = Db.GetConnection();

GetConnectionは静的メソッドであるため、コンストラクターで設定している可能性のあるメンバー属性は表示されません(静的メソッドである場合を除く)。それらがすべて静的である場合は、読みやすいシングルトンパターンを使用するようにコードをリファクタリングすることを検討してください。

もう1つのことは、接続属性が、(アプリケーションごとではなく)要求ごとに生成されるページクラスのメンバーであるということです。ToolTipつまり、メソッド(およびデータベースにアクセスする他のメソッド)で新しい接続を作成するか、connection属性を静的にしてアプリケーションごとに作成する必要があります。

于 2011-07-18T20:37:19.787 に答える
1

2つのことを試してください:

1 ..ToolTip()メソッドの場合、columnCOLUMN_NAMEと比較する値は、文字列/varcharリテラル値を示す一重引用符で適切にラップする必要があります。COLUMN_NAME = fooおそらくそれはいつあるべきかを評価して いますCOLUMN_NAME = 'foo'

cmd.CommandText = "SELECT DISTINCT COMMENTS " +                      
"FROM SYS.ALL_COL_COMMENTS " +                      
"WHERE (TABLE_NAME = 'CTD_PROBLEM_EDIT_V') " +                      
"AND (COLUMN_NAME = '" + column + "')";

2..アドホックSQLステートメントをBEGINとでラップしてみてくださいEND

SELECT3..動的ORDER BY句の文字列構築をリファクタリングすることを検討してください。SelectCommandでそれを実行していることは、以下の多くの行は、後のカジュアルなオブザーバーやメンテナーには明らかではありません。

 string selectCommand = string.Format("SELECT {0}.* FROM {0} ORDER BY {1}"
                                       ,Settings.TABLE 
                                       ,string.Join(",",Settings.OB));
于 2011-07-18T20:50:38.300 に答える