ORA-01036:非法变量名称/编号

本文关键字:编号 变量名 非法 ORA-01036 | 更新日期: 2023-09-27 18:02:03

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

工具提示();抛出错误:无效的操作。连接已关闭。

编辑:

这将是有用的:静态类和静态类成员

ORA-01036:非法变量名称/编号

可能不是问题,但这看起来很奇怪:

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

GetConnection是一个静态方法,因此它不会看到您可能在构造函数中设置的任何成员属性(除非它们也是静态的)。如果它们都是静态的,考虑重构你的代码,使用单例模式,因为它更具可读性。

另一件事是,connection属性是为每个请求(而不是每个应用程序)生成的页面类的成员。这意味着您需要在ToolTip方法(以及访问数据库的任何其他方法)中创建一个新连接,或者将connection属性设置为静态,以便每个应用程序都使用它。

尝试两件事:

1 . .对于ToolTip()方法,要比较COLUMN_NAME的值column需要用单引号正确地包装,以指示字符串/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 . .尝试在BEGINEND中包装您的特殊SQL语句

3 . .考虑为SELECT和动态ORDER BY子句重构字符串构建。您是在下面的SelectCommand上做的,对于它以后的日常观察者或维护者来说,这是不明显的。

 string selectCommand = string.Format("SELECT {0}.* FROM {0} ORDER BY {1}"
                                       ,Settings.TABLE 
                                       ,string.Join(",",Settings.OB));