Member 13937760 Ответов: 1

Не удается выполнить обновление


Я заполнил таблицу с управлением ретранслятора.когда пользователь нажимает кнопку Изменить, он перенаправляется на следующую страницу, где доступна форма для изменения, и данные из таблицы автоматически заполняются в эти поля.После обновления, если пользователь нажмет кнопку Обновить, он должен обновиться в базу данных.но в моем случае после нажатия кнопки Обновить он снова вернется к исходным данным. some one plz помогите мне.я прикрепил свой код

Что я уже пробовал:

public partial class StudEdit : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            String s = Request.QueryString["ID"].ToString();
            lblStudentID.Text = s;
            string constr = ConfigurationManager.ConnectionStrings["constring"].ConnectionString;
            SqlConnection con = new SqlConnection(constr);
            con.Open();
            try
            {
                SqlCommand cmd = new SqlCommand(
               "select * from tbl_Student where StudentID=" + s + "", con);
                SqlDataReader sd = cmd.ExecuteReader();
                while (sd.Read())
                {
                    inputName.Text = sd.GetValue(1).ToString();
                    inputClass.Text = sd.GetValue(2).ToString();
                }
            }
            catch (SqlException ex)
            {

            }
            con.Close();
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            String id = Request.QueryString["ID"];
            string constr2 = ConfigurationManager.ConnectionStrings["constring"].ConnectionString;
            SqlConnection con2 = new SqlConnection(constr2);
            con2.Open();
            try
            {
                SqlCommand cmd2 = new SqlCommand("update [informationdb].[dbo].[tbl_Student] set StudentName='" + inputName.Text + "',StudentClass=" + inputClass.Text + "where StudentID=" + id + "", con2);
                cmd2.ExecuteNonQuery();
                status.Text = "Data updated sucessfully";
                cmd2.Dispose();
            }catch(Exception ex)
            {
                status.Text =""+ ex;
            }
            con2.Close();
        }
    }
}

1 Ответов

Рейтинг:
0

Eric Lynch

Несколько вещей...при загрузке вашей страницы у вас есть catch это просто отбрасывает любое исключение SQL. Вы почти никогда не должны этого делать. В общем, вы должны либо (по крайней мере) регистрировать, либо смягчать исключение.

При нажатии кнопки вы сохраняете исключение в некотором тексте состояния. Возникает ли исключение? Не могли бы вы поделиться текстом, если это так?

Еще одно наблюдение: у вас есть утечка ресурсов. Вы не избавляетесь от cmd вообще. Вы не избавляетесь от sd И вы не избавляетесь от них . cmd2, если происходит исключение.

Я предлагаю вам ознакомиться с C# using заявление. Типичная картина была бы:

using(var con = new SqlConnection(conStr))
{
  con.Open();
  using(var cmd = new SqlCommand(cmdStr, con))
  {
    // Do work here
  }
}


С using кроме того, гораздо меньше шансов, что вы случайно введете утечку ресурсов.

Добавляя еще один момент, Вы должны использовать параметры SQL вместо конкатенации строк при построении ваших команд. В противном случае вы станете очень легкой мишенью для хакеров с помощью атаки SQL-инъекций.

Видеть: SQL-инъекция | Microsoft Docs[^]

Наконец, без какого-либо текста исключения я не могу определенно сказать, в чем может быть ваша проблема. Однако я могу сказать, что ваша команда обновления SQL недопустима.

Как минимум, вам не хватает цитирования по значению StudentClass столбец, и вам не хватает пробела перед командой WHERE.


Member 13937760

в этом поле состояния отображаются только успешно обновленные данные. я дал место тому, где и StudentClass-это число, поэтому я не давал одинарных кавычек.

Eric Lynch

ОК. Без пробела перед WHERE, который, похоже, вы теперь добавили, вы бы определенно получили исключение. Надеюсь, вы также исправили многие другие проблемы, о которых я упоминал.

Я добавлю еще один. Многие методы возвращают значение. Вы должны действительно проверить это. ExecuteNonQuery-один из таких методов. Он возвращает количество строк, затронутых (в данном случае обновленных) командой.

Если у вас нет исключений, есть две возможности. Если возвращаемое значение не равно нулю, вы обновляете другую строку, чем ожидали. В противном случае, и это более вероятно, если возвращаемое значение равно нулю, то ваше предложение WHERE неверно. В любом случае, скорее всего, значение "id" не то, что вы ожидаете.

Я занимаюсь этим уже очень давно. SQL очень точен в том, что он сообщает. Предполагая, что все, что вы упомянули, является точным, SQL либо выдаст исключение, либо вернет нулевое значение (чтобы указать, что строка не была обновлена). Единственные другие возможности заключаются в том, что строка, которую вы ожидали, была обновлена (но вы этого не заметили) или была обновлена другая строка, чем вы ожидали. Я предполагаю, что ни одна из этих других возможностей здесь не имеет места (но это стоит того, чтобы вы дважды проверили обе).

Хорошая новость заключается в том, что Ваш пункт WHERE очень прост. Это должно быть легко исправить. Попробуйте либо отобразить значение "id" в своем сообщении "успех", либо научиться использовать отладчик. Я предлагаю последнее. Отладчик позволит вам не только изучить переменную "id", но и изучить другие переменные, а также выполнить пошаговую проверку потока вашего кода.

Что касается вашего кода, хотя он и не является причиной вашего симптома, я добавлю еще одну проблему в список. Вы добавляете пустую строку ("") в начало и конец многих ваших строк. В этом нет необходимости. Например, "" + "А" + "" - это все еще только "а".

Если у вас по-прежнему есть проблема, я предлагаю обновить ваш вопрос со всеми включенными исправлениями в код. Кроме того, я бы обновил вопрос, чтобы включить всю недостающую информацию, которую вы не упомянули в своем вопросе. Например...добавьте, что поле состояния показывает "данные успешно обновлены", и никаких исключений не происходит. И, если вы проверяете возвращаемое значение, добавьте, что "возвращаемое значение из ExecuteNonQuery равно ?".

Вся эта недостающая информация, если она будет добавлена, поможет вам и любому, кто попытается ответить на ваш вопрос, диагностировать проблему.

Member 13937760

охраняемых недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
Строка id = запрос.QueryString["ID"];
строка constr2 = ConfigurationManager.ConnectionStrings["constring"].Параметр connectionString;
using (SqlConnection con2 = new SqlConnection(constr2))
{
con2.Открыть();
String query = "update tbl_Student set StudentName='@name',StudentClass=@stcls where StudentID=@stid";
используя (sqlcommand, который cmd2 = новый sqlcommand, который(запрос, con2))
{
cmd2.параметры.AddWithValue ("@name", inputName.Text.Trim());
cmd2.параметры.AddWithValue ("@stcls", inputClass.Text.Trim());
cmd2.параметры.AddWithValue("@stid", id);
cmd2.Метод executenonquery();
}
}
}
здесь я обновил его, как указано вами, но все же, когда я нажимаю кнопку обновления, он снова возвращается к своему старому значению.у меня есть только несколько записей, поэтому другие записи не обновляются. я не знаю, почему он не обновляется

Eric Lynch

Вы все еще не проверяете состояние возврата из cmd2.ExecuteNonQuery(), как это рекомендуется. Это фактически сообщит вам, удалось ли обновление или нет.

Вы не показываете ни успех, ни неудачу, основываясь на этом статусе возврата. Это позволит вам поделиться этой информацией с любым, кто попытается вам помочь. Вы также все еще не сообщаете значение переменной id, поэтому вы можете проверить, что она имеет то значение, которое вы думаете, что она имеет.

Я не могу сказать, удалили ли вы также обработку исключений. Если у вас есть, это тоже не хорошо.

Наконец, вам не нужны кавычки вокруг параметра @name. Это изменит значение StudentName на фактический текст '@name' вместо значения параметра.

Я также предложил обновить ваш вопрос, а не добавлять еще один комментарий. Это может позволить другим также помочь вам. Когда вы делаете это, вы должны включить соответствующую информацию для вопроса, который в настоящее время отсутствует. Такие вещи, как:

"никаких исключений не произошло" или "текст исключения был ???" -И-
"статус возврата из ExecuteNonQuery был ???"