UpdateCommand в Gridview DataSource возвращает ошибку ORA-01036: недопустимое имя / номер переменной - PullRequest
0 голосов
/ 20 июля 2011

У меня есть GridView, который извлекает данные из базы данных Oracle динамически.

<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" };

Ответы [ 3 ]

3 голосов
/ 23 сентября 2011

Поскольку dataKeyNames будут добавлены в качестве параметров для updateCommand автоматически, поэтому количество параметров не будет одинаковым для command_text и dataSource. Вам нужно удалить их перед обновлением

1 голос
/ 20 июля 2011

У меня дома нет настройки среды разработки, поэтому я не могу проверить свое предложение. Посмотрите, работает ли размещение этого на вашем sqlDataSource. ConflictDetection = "OverwriteChanges"

Пример:

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

UPDATE:

Другая возможность состоит в том, что одно из ваших имен параметров слишком длинное. Предел длиной 31 или 32 символа. В прошлом, когда я динамически создавал список параметров, я просто давал соответствующему имени параметра общее имя (например, Param [x]) и увеличивал имя параметра с помощью цикла (например, Param1, Param2, Param3 и т. Д. для каждого параметра, который должен быть в выражении). Некоторые другие предложения могут быть проверены, чтобы ваши имена параметров, используемые из заголовка, были действительными (то есть без пробелов).

Моей последней мыслью будет то, что SqlDataSource несовместим. Используете ли вы System.Data.OracleClient ИЛИ Oracle.DataAccess.Client? Попробуйте использовать другого поставщика, чтобы увидеть, если это имеет значение.

См. Эти статьи для дополнительной помощи. Это обо всем, что я получил. Извините!

Oracle.DataAccess.Client и SqlDataSource в ASP.NET

при обновлении gridview создается ORA-01036: недопустимое имя / номер переменной

UPDATE: Как предложено выше, попробуйте сменить поставщика данных, в этом случае попробуйте ODP.NET. Вам придется установить его. Это не системная библиотека. Поиск использования ODBC с Oracle может быть другим вариантом. В любом случае у вас, вероятно, не останется никаких вариантов, кроме как ничего не использовать с System.Data.OracleClient.

Исправлено! Oracle 11G и SqlDataSource: уродливый «ORA-01036: недопустимое имя / номер переменной» Выпуск

Поставщик данных Oracle для .NET

0 голосов
/ 22 июля 2011

Я нашел способ обойти проблему. Не самый лучший, но приемлемый. Вместо DS.UpdateCommand я использую OracleCommand, просто игнорируя исключение при настройке UpdateCommand.

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