2011-07-19 30 views
0

Oracle DataBaseからデータを動的に取得するGridViewがあります。GridView DataSourceのUpdateCommandがエラーを返しますORA-01036:不正な変数名/数値

<asp:GridView ID="gvData" runat="server" DataSourceID="DS" CellPadding="4" 
     ForeColor="#333333" AllowSorting="True" AllowPaging="True" 
     ShowFooter="True" AutoGenerateDeleteButton="True" 
     AutoGenerateEditButton="True" AutoGenerateSelectButton="True" 
     OnRowDataBound="gvData_RowDataBound" 
     OnSelectedIndexChanged="gvData_SelectedIndexChanged" 
     OnRowUpdating="gvData_RowUpdating" OnRowUpdated="gvData_RowUpdated" 
     OnRowDeleting="gvData_RowDeleting" OnRowDeleted="gvData_RowDeleted"> 
     <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
     <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
     <PagerStyle BackColor="#284775" ForeColor="White" /> 
     <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" 
      ForeColor="#333333" /> 
     <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
     <EditRowStyle BackColor="#CCCCCC" /> 
     <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
    </asp:GridView> 

    <asp:SqlDataSource ID="DS" runat="server"> 
    </asp:SqlDataSource> 

それはDELETEステートメントを/ SELECT/INSERTで正常に動作しますが、しかし、それは声明を更新するために来るとき、それは誤りORA-01036を返します。不正な変数名/番号

protected void gvData_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    double number; 
    List<string> text = new List<string>(); 
    List<string> pkParam = new List<string>(); 
    TextBox tb = new TextBox(); 
    LinkButton lb = new LinkButton(); 

    for (int i = 1; i < gvData.HeaderRow.Cells.Count; i++) 
    { 
     try 
     { 
      lb = (LinkButton)gvData.HeaderRow.Cells[i].Controls[0]; 
      tb = (TextBox)gvData.Rows[e.RowIndex].Cells[i].Controls[0]; 

      if (tb.Text.Length > 0 && !Settings.PK.Contains(lb.Text)) 
       if(Double.TryParse(tb.Text.ToText(), out number)) 
        text.Add(lb.Text + " = " + number); 
       else 
        text.Add(lb.Text + " = " + "'" + tb.Text.ToText() + "'"); 
     } 
     catch { } 
    } 

    foreach (string pk in Settings.PK) 
    { 
     pkParam.Add(pk + " = :" + pk); 
     DS.UpdateParameters.Add(
      new Parameter(pk, TypeCode.String, e.Keys[pk].ToString())); 
    } 

    DS.UpdateCommand = string.Format("UPDATE {0} SET {1} WHERE {2}", 
     Settings.TABLE, string.Join(",", text.ToArray()), 
      string.Join(" AND ", pkParam.ToArray())); 
} 

コードRowUpdateは本当に重要ではありません。私はすべての更新ステートメントを記述し、同じエラーを返します。 アイデア、人々?あなたの前にありがとう!

サンプルクエリ:

DS.UpdateCommand = "UPDATE ATDB.CTD_PROBLEM_EDIT_V SET CUTTING_COMMENTS = 'rrr'"; 

PK:

public static string[] PK = new string[] { "PROBLEM_DEPTH_MD", "API", "BUS_AREA_ID" }; 
+0

コードが問題であるとは私は確信していません。 UPDATEステートメントが失敗すると言います。失敗するSQL文の例を提供できますか?また、Settings.PKの値を確認するのに役立ちますか? – Alban

+0

編集を参照してください。私はPL/SQL Developerでこのクエリ(および他の多くのもの)をテストしました。 DS.UpdateCommandに "UPDATE"を入れても、同じエラーが出ます。そして、ここの原型のキーが何であるかは本当に問題ではありません。異なるキーで別のテーブルを使用することができます。注:deleteステートメントは同じSettings.PKを使用し、正常に動作します。 –

+0

ちょうどいくつかのスタイルの提案:色の宣言を取り除き、CSSを使用して、aspxコードを少しきれいにする; NLogを使用して、catch文の中にlog文を出力します。例外がスローされたことを認識したときに多くのエラーが検出されます。 – verisimilidude

答えて

0

私は問題の周りに自分の道を見つけました。最高のものではなく、受け入れられるもの。 DS.UpdateCommandの代わりに、OracleCommandを使用して、UpdateCommandの設定に関する例外を無視します。

protected void gvData_RowUpdated(object sender, GridViewUpdatedEventArgs e) 
{ 
    if (e.Exception != null) 
     e.ExceptionHandled = true; 
} 
1

私は自宅でのdevの環境設定を持っていないので、私は私の提案を確認することができません。これをsqlDataSourceに配置することが効果的かどうかを確認してください。 ConflictDetection = "OverwriteChanges"

例:

<asp:SqlDataSource ID="DS" ConflictDetection="OverwriteChanges" runat="server"> 
</asp:SqlDataSource> 

UPDATE:

もう一つの可能​​性は、あなたのパラメータ名の1が長すぎるということです。制限は31文字または32文字です。過去に私がパラメータリストを動的に作成していたとき、対応するパラメータ名に一般名(例えばParam [x])を与え、パラメータ名をループ(Param1、Param2、Param3など)ステートメントに必要な各パラメーターについてオンにする)。ヘッダーから使用されているパラメーター名が有効であることを確認することもできます(つまり、スペースは不要です)。

私の最後の考えは、SqlDataSourceが互換性がないということです。 System.Data.OracleClientまたはOracle.DataAccess.Clientを使用していますか?異なるプロバイダを使用して、違いがあるかどうかを確認してください。

追加のヘルプについては、これらの記事を参照してください。それは私が得たすべてのことです。ごめんなさい!

Oracle.DataAccess.Client and SqlDataSource in ASP.NET

update on gridview produces ORA-01036: illegal variable name/number

UPDATE: 上で示唆したように、この場合には、ODP.NETを試してみてください、あなたのデータプロバイダを切り替えよう。あなたはそれをインストールする必要があります。これはシステムライブラリではありません。オラクルでODBCを使用することも別の選択肢です。いずれにしても、おそらくオプションがなくSystem.Data.OracleClientで何も使用しないことになります。

Fixed! Oracle 11G and SqlDataSource: The ugly 'ORA-01036: illegal variable name/number' Issue

Oracle Data Provider for .NET

+0

これはデフォルトで設定されています。そして私は.apsxと.aspの両方で設定しようとしました –

+0

更新された提案を見てください。それが役に立てば幸い。 – Alban

+0

問題はパラメータではありません。私はaneパラメータなしで文を使うことも、コマンド内に "UPDATE"だけを書くこともできます。それでも私には同じエラーが発生します。 System.Data.OracleClientを使用していますが、参照リストにもう1つありません。リンクをありがとう、私は今それらを見てみましょう。 –

3

パラメータを自動的にUpdateCommandようdataKeyNamesが追加されるので、パラメータはcommand_textとデータソースとの間の等しくない数えるため。 更新する前に削除する必要があります

関連する問題