2011-07-14 93 views
3

我從Oracle數據庫檢索數據並填充gridview。接下來,我嘗試運行一個查詢來選擇一些數據,但我得到一個錯誤。 下面是代碼:ORA-01036:非法變量名稱/編號

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();引發錯誤: 操作無效。連接已關閉。

編輯:

這將是有幫助的: Static Classes and Static Class Members

+0

有你看着生成的SQL?您是否在順序列表中的最後一列之後添加逗號? –

+0

發佈命令時不需要逗號,它會給你ORA-00911:無效的字符。無論如何,問題出在UpdateCommand中。 –

+0

對不起,我讀過你的評論錯了。逗號在這裏添加foreach(在Settings.OB中的字符串ob)selectCommand + = ob +「,」; –

回答

3

可能不是問題,但這個看起來奇怪:

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

GetConnection是一個靜態方法,因此它沒有看到你可能在構造函數中設置的任何成員屬性(除非它們是靜態的)。如果它們都是靜態的,考慮重構代碼以使用單例模式,因爲它更具可讀性。

另一件事是,連接屬性是爲每個請求(不是每個應用程序)生成的頁面類的成員。這意味着您需要在ToolTip方法(以及任何其他訪問數據庫的方法)中創建新連接,或者使connection屬性爲靜態,以使其成爲每個應用程序。

+0

謝謝!問題實際上是在靜態方法和類中。 –

1

嘗試兩兩件事:

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 ..嘗試包裝你的ad-hoc SQL語句BEGINEND

3 ..考慮重構你的字符串建設的SELECT和動態ORDER BY條款。你在SelectCommand上做了以下的許多行,對於其後的一些觀察者或維護者來說並不明顯。

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

1.它評估爲'foo'。聲明中有單引號。 –

+0

2.它給出一個錯誤:ORA-06550:第1行,第105列: PL/SQL:ORA-00933:SQL命令未正確結束 ORA-06550:第1行,第7列: PL/SQL:SQL語句忽略 ORA-06550:第1行,第107列: PLS-00103:在期待以下某項時遇到符號「文件結束」: ; –

+0

3.謝謝!你將如何重構刪除或其他包含參數的語句? foreach(在Settings.PK中的字符串pk) { deleteCommand + =「」+ pk +「=:」+ pk +「AND」;新的參數(pk,TypeCode.String,e.Keys [pk] .ToString())); } –

相關問題