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