2011-07-14 43 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();エラーをスローします。 操作が無効です。接続は閉じられています。

EDIT:

これは参考になりましたでしょう: Static Classes and Static Class Members

+0

あなたが生成されたSQLを見たことがありますか? order-byリストの最後の列の後にカンマを追加しますか? –

+0

コマンドを受け入れるときにコンマは必要ありません。ORA-00911:無効な文字です。いずれか、問題はUpdateCommandにあります。 –

+0

申し訳ありませんが、私はあなたのコメントを間違って読んだ。コンマがここに追加されますforeach(文字列obのSettings.OB)selectCommand + = ob + "、"; –

答えて

3

は問題ではないかもしれませんが、これは奇妙に見える:

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

GetConnectionは静的メソッドであるため、それはありませんコンストラクターで設定しているメンバー属性は表示されません(静的でない場合を除きます)。それらがすべて静的である場合は、シングルトンパターンを読みやすくするためにコードをリファクタリングすることを検討してください。

もう1つのことは、接続属性がリクエストごとに(アプリケーションごとではなく)生成されるページクラスのメンバーであることです。つまり、ToolTipメソッド(およびデータベースにアクセスする他のメソッド)で新しい接続を作成するか、connection属性を静的にしてアプリケーションごとに作成する必要があります。あなたのToolTip()方法については、COLUMN_NAMEのために比較する値columnが文字列/ VARCHARリテラル値を示す単一引用符で適切に包まれる必要があります。..

1:

+0

ありがとう!問題は実際に静的メソッドとクラスにありました。 –

1

は、2つのことを試してみてください。可能であれば、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 ..あなたSELECTとダイナミックORDER BY句のためのあなたの文字列の建物をリファクタリング考えてみましょう。.. BEGINEND

3であなたのアドホックSQL文をラップ試してみてください。あなたが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"; DS.DeleteParameters.Add( 新しいパラメータ(pk、TypeCode.String、e.Keys [pk] .ToString())); } –