2013-08-15 1 views
2
<asp:SqlDataSource ID="charges_gv_datasource" runat="server" ConnectionString="edited" 
ProviderName="System.Data.OracleClient" SelectCommand="WITH relevant_ids AS (SELECT ir.result_id AS relevant_result_id FROM inspection_result_tbl ir) SELECT ir.charge_id, LISTAGG(ir.result_id, ', ') WITHIN GROUP (ORDER BY ir.charge_id) AS result_ids, ch.charge_progress, ch.claim_verification, ch.hours_allowed, ch.sap_notification, ch.total_checked, ch.charge FROM inspection_result_tbl ir LEFT JOIN relevant_ids ON ir.result_id=relevant_ids.relevant_result_id LEFT JOIN charges_tbl ch ON ir.charge_id=ch.charge_id WHERE ir.charge_id IS NOT NULL AND ir.result_id=relevant_ids.relevant_result_id GROUP BY ir.charge_id, ch.charge_progress, ch.claim_verification, ch.hours_allowed, ch.sap_notification, ch.total_checked, ch.charge" 
UpdateCommand="UPDATE [charges_tbl] SET [CLAIM_VERIFICATION] = :claim_verification, [CHARGE_PROGRESS] = :charge_progress, [SAP_NOTIFICATION] = :sap_notification WHERE [CHARGE_ID] = :charge_id"> 

          </asp:SqlDataSource> 

          <asp:GridView ID="charges_gv" runat="server" AutoGenerateEditButton="true" DataSourceID="charges_gv_datasource" DataKeyNames="charge_id" 
          AutoGenerateColumns="false" Width="805px"> 
          <Columns> 
           <asp:TemplateField HeaderText="Charge ID" SortExpression="charge_id"> 
            <EditItemTemplate> 
             <asp:Label ID="Label1" runat="server" Text='<%# Eval("charge_id") %>'></asp:Label> 
            </EditItemTemplate> 
            <ItemTemplate> 
             <asp:Label ID="Label1" runat="server" Text='<%# Bind("charge_id") %>'></asp:Label> 
            </ItemTemplate> 
           </asp:TemplateField> 
           <%--<asp:BoundField DataField="charge_id" HeaderText="Charge ID" ItemStyle-HorizontalAlign="Center" />--%> 
           <%--<asp:BoundField DataField="result_ids" HeaderText="Result ID" ItemStyle-HorizontalAlign="Center" />--%> 
           <asp:TemplateField HeaderText="Result ID" ItemStyle-HorizontalAlign="Center"> 
            <ItemTemplate> 
             <asp:Label ID="resultid" runat="server" Text='<%# Bind("result_ids")%>' /> 
            </ItemTemplate> 
           </asp:TemplateField> 
           <asp:TemplateField HeaderText="Total Checked" ItemStyle-HorizontalAlign="Center"> 
            <ItemTemplate> 
             <asp:Label ID="totalCheckedCT" runat="server" Text='<%# Eval("total_checked")%>' /> 
            </ItemTemplate> 
           </asp:TemplateField> 
           <asp:TemplateField HeaderText="Hours Allowed" ItemStyle-HorizontalAlign="Center"> 
            <ItemTemplate> 
             <asp:Label ID="hoursAllowedCT" runat="server" Text='<%# Eval("hours_allowed")%>' /> 
            </ItemTemplate> 
           </asp:TemplateField> 
           <asp:TemplateField HeaderText="Charge" ItemStyle-HorizontalAlign="Center"> 
            <ItemTemplate> 
             <asp:Label ID="chargeCT" runat="server" Text='<%# Eval("charge")%>' /> 
            </ItemTemplate> 
           </asp:TemplateField> 
           <asp:BoundField DataField="claim_verification" HeaderText="Claim Verification" ItemStyle-HorizontalAlign="Center" /> 
           <asp:BoundField DataField="charge_progress" HeaderText="Charge Progress" ItemStyle-HorizontalAlign="Center" /> 
           <asp:BoundField DataField="sap_notification" HeaderText="SAP Notification" ItemStyle-HorizontalAlign="Center" /> 
          </Columns> 
         </asp:GridView> 

У меня есть источник данных и сетка, и я пытаюсь включить редактирование в строках gridview. Все работает отлично, поэтому я могу щелкнуть правой кнопкой мыши, изменить поля на текстовые поля, кнопки отмены и обновления будут отображаться и работать, но если я изменю значения и нажмите кнопку обновления, я получу ошибку:Ошибка строки сетки UPDATE

ORA-01036: незаконно переменное имя/номер

Любые идеи, почему? Я проверил все написания в команде update, и все правильно. Пожалуйста, помогите мне.

Трассировка стека:

[OracleException (0x80131938): ORA-01036: illegal variable name/number 
] 
    System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc) +488568 
    System.Data.OracleClient.OracleParameterBinding.Bind(OciStatementHandle statementHandle, NativeBuffer parameterBuffer, OracleConnection connection, Boolean& mustRelease, SafeHandle& handleToBind) +1297 
    System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals) +1204 
    System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor) +656 
    System.Data.OracleClient.OracleCommand.ExecuteNonQuery() +158 
    System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand command, DataSourceOperation operation) +2790646 
    System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +4065616 
    System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +1350 
    System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +626 
    System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +70 
    System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +110 
    System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +70 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +29 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2981 
+0

Можете ли вы дайте нам знать, если вы нашли решение для этого? ниже ответ сработал для нас, но если без установки/изменения каких-либо инструментов, будет предпочтительным –

ответ

1

Есть много resons, почему это приходит. Иногда, потому что мы не используем инструменты Oracle, а иногда из-за неправильной разметки gridview.

, поскольку вам не требуется обновлять значение Column: charge_id, вы не можете использовать BoundField для того же, если не указан его в DataKeyNames свойства SqlDataSource.

A BoundField, если не указан в DataKeyNames, генерирует переменную связывания, которая, если она не используется в операторе обновления, приведет к ORA-01036. Чтобы избежать ошибки, либо указать это поле DataKeyNames собственности или изменить к TemplateField и использовать Eval.so два возможных случая я предвижу:

1.) Установите DataKeyNames свойство вашего SqlDataSource в charge_id.

<asp:SqlDataSource ID="charges_gv_datasource" runat="server" ConnectionString="edited" 
ProviderName="System.Data.OracleClient" 
DataKeyNames="charge_id" 
SelectCommand="WITH relevant_ids AS (SELECT ir.result_id AS relevant_result_id 
FROM inspection_result_tbl ir) SELECT ir.charge_id, ....." 
UpdateCommand="UPDATE [charges_tbl] SET [CLAIM_VERIFICATION] = :claim_verification,..."> 

2.) Если вариант 1 не подходит, то:

Проводы разметку, безусловно, у вас есть <EditItemTemplate> на месте, как вы не показали то же самое для многих из <asp:TemplateField> пунктов.

Убедитесь, что вы положили свою колонку charge_id в <asp:TemplateField>. Используйте <asp:Lable>, поэтому он не будет изменен даже в режиме редактирования.

<asp:TemplateField HeaderText="charge_id" SortExpression="charge_id"> 
<EditItemTemplate> 
<asp:Label ID="Label1" runat="server" Text='<%# Eval("charge_id") %>'></asp:Label> 
</EditItemTemplate> 
<ItemTemplate> 
<asp:Label ID="Label1" runat="server" Text='<%# Bind("charge_id") %>'></asp:Label> 
</ItemTemplate> 
</asp:TemplateField> 

Видя трассировки стека при условии, позже,: Лучше использовать инструменты Oracle Developer (ODT) для VS и ODP.NET, так как они лучше интегрированы с .NET и Oracle.

ODP.NET использует Oracle.DataAccess.Client пространство имен. System.Data.OracleClient принадлежит провайдеру MS для Oracle. Строка соединения в web.config необходимо использовать Oracle.DataAccess.Client, как показано ниже:

<connectionStrings> 
<add name="ConnectionString1" 
connectionString="Data Source=192.168.1.104/orcl;Persist Security Info=True;User  
ID=system;Password=xxxxxx;" 
providerName="Oracle.DataAccess.Client" /> 
</connectionStrings> 

Переход через эту полную почту для справки: https://forums.oracle.com/message/2368331?#2366331http://forums.oracle.com/forums/thread.jspa?threadID=62196

+0

Я пробовал вариант 2, так как это не позволило мне ввести поле datakeynames в sqldatasource. Я изменил связанное поле в поле шаблона, и я все еще получаю ту же ошибку. – Safinn

+0

Покажите свою разметку, где вы определили новое поле шаблона –

+0

Обновлено первое сообщение с новым кодом сетки. – Safinn