ORA-01036: недопустимое имя / номер переменной

Я получаю данные из базы данных Oracle и заполняю gridview. Затем я пытаюсь выполнить запрос, чтобы выбрать некоторые данные, но получаю ошибку. Вот код:

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);
}

Всплывающий (); выдает ошибку: недопустимая операция. Соединение закрыто.

РЕДАКТИРОВАТЬ:

Это было бы полезно: статические классы и члены статических классов

2 ответа

Решение

Не может быть проблемой, но это выглядит странно:

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

GetConnection это статический метод, и поэтому он не видит атрибутов-членов, которые вы можете устанавливать в конструкторе (если они не являются статичными). Если они все статические, рассмотрите возможность рефакторинга вашего кода, чтобы использовать шаблон синглтона, так как он более читабелен.

Другое дело, что атрибут соединения является членом класса страницы, который генерируется для каждого запроса (не для приложения). Это означает, что вам нужно либо создать новое соединение в ToolTip метод (и любой другой метод, который обращается к базе данных) или сделать connection атрибут static, чтобы сделать его для каждого приложения.

Попробуйте 2 вещи:

1.. Для вашего ToolTip() метод, значение column для сравнения для COLUMN_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

3.. Рассмотрите возможность рефакторинга вашего строения строки для вашего SELECT и динамический ORDER BY пункт. То, что вы делаете это с помощью SelectCommand много строк ниже, не очевидно для случайного наблюдателя или сопровождающих позже в его жизни.

 string selectCommand = string.Format("SELECT {0}.* FROM {0} ORDER BY {1}"
                                       ,Settings.TABLE 
                                       ,string.Join(",",Settings.OB));
Другие вопросы по тегам