ОБНОВЛЕНИЕ Сетка Строка Ошибка просмотра
<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>
У меня есть источник данных и вид сетки, и я пытаюсь включить редактирование строк сетки. Все работает отлично, поэтому я могу нажать кнопку "Изменить", поля изменяются на текстовые поля, кнопки отмены и обновления появляются и работают, но если я изменяю значения и нажимаю кнопку обновления, я получаю сообщение об ошибке:
ORA-01036: недопустимое имя / номер переменной
Есть идеи почему? Я проверил все написания в команде обновления, и все это правильно. Пожалуйста, помогите мне.
Трассировки стека:
[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
1 ответ
Есть много причин, почему это происходит. Иногда потому, что мы не используем инструменты Oracle, а иногда из-за неправильной разметки gridvie w.
так как вам не требуется обновлять значение Column: charge_id
вы не можете использовать BoundField для того же самого, если вы не укажете его в DataKeyNames
собственностью SqlDataSource
,
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 Tools (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.