我有一个GridView,可以动态地从Oracle DataBase中提取数据。
<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>
它适用于SELECT / INSERT / DELETE语句,但是当涉及到UPDATE语句时,它会返回错误 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 :(得分:3)
因为dataKeyNames会自动作为参数添加到updateCommand,所以command_text和dataSource之间的参数count不相等。 您需要在更新前删除它们
答案 1 :(得分:1)
我家里没有设置开发环境,所以我无法检查我的建议。看看将它放在你的sqlDataSource上是否适合你。 ConflictDetection = “OverwriteChanges”
示例:强>
<asp:SqlDataSource ID="DS" ConflictDetection="OverwriteChanges" runat="server">
</asp:SqlDataSource>
<强>更新强>
另一种可能性是您的某个参数名称太长。限制长度为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
<强>更新强> 如上所述,尝试切换数据提供程序,在这种情况下,请尝试ODP.NET。你必须安装它。它不是系统库。希望将ODBC与Oracle一起使用可能是另一种选择。在任何情况下,您可能没有选择,只能不使用System.Data.OracleClient。
Fixed! Oracle 11G and SqlDataSource: The ugly 'ORA-01036: illegal variable name/number' Issue
答案 2 :(得分:0)
我找到了解决问题的方法。不是最好的,但可以接受。
而不是DS.UpdateCommand
我使用OracleCommand而忽略了关于设置UpdateCommand的异常。
protected void gvData_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
if (e.Exception != null)
e.ExceptionHandled = true;
}