ORA-01036: недопустимое имя / номер переменной - PullRequest
3 голосов
/ 15 июля 2011

Я получаю данные из базы данных 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);
}

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

EDIT:

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

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

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

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

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

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

1 голос
/ 19 июля 2011

Попробуйте 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));
...