Member 14534831 Ответов: 1

Как обновить данные в элементе управления texbox по выбранному значению dropdownlist с помощью хранимой процедуры ?


Я хочу обновить данные в базу данных из элемента управления textbox с выбранным значением dropdownlist с помощью хранимой процедуры.

Может ли кто-нибудь дать решение?

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

[веб-дизайн]

<table align="center">
                <tr>
                    <td>Id</td>
                    <td><asp:DropDownList ID="ddlId" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlId_SelectedIndexChanged" /></td>
                </tr>
              <tr>
                  <td>Name</td>
                  <td><asp:TextBox ID="txtName" runat="server" /></td>
              </tr>
                <tr>
                    <td>Mobile</td>
                    <td><asp:TextBox ID="txtMobile" runat="server" /></td>
                </tr>
                <tr>
                    <td>Email</td>
                    <td><asp:TextBox ID="txtEmail" runat="server" /></td>
                </tr>
                <tr>
                    <td align="right"><asp:Button ID="btnUpdate" runat="server" Text="Update" Width="70" OnClick="btnUpdate_Click" /></td>
                    <td><asp:Button ID="btnDelete" runat="server" Text="Delete" Width="70" OnClick="btnDelete_Click" /></td>
                </tr>
            </table>


[исходный код]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

namespace ASPNETMVC
{
    public partial class test1 : System.Web.UI.Page
    {
        SqlConnection con;
        SqlCommand cmd;
        SqlDataReader dr;
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
                con = new SqlConnection("Data Source=.\\SQLEXPRESS;Database=sample3;Integrated Security=true");
                cmd = new SqlCommand("select * from test", con);
                con.Open();
                dr = cmd.ExecuteReader();
                ddlId.DataSource = dr;
                ddlId.DataTextField = "Id";
                ddlId.DataValueField = "Id";
                ddlId.DataBind();
                ddlId.Items.Insert(0, "---Select---");
                con.Close();
            }
        }

        protected void ddlId_SelectedIndexChanged(object sender, EventArgs e)
        {
            if(ddlId.SelectedIndex>0)
            {
               
                cmd.CommandText = "select * from test where Id="+ddlId.SelectedValue;
                cmd.CommandType = CommandType.Text;
                con.Open();
                dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    txtName.Text = dr["Name"].ToString();
                    txtMobile.Text = dr["Mobile"].ToString();
                    txtEmail.Text = dr["Email"].ToString();
                }
                con.Close();
            }
            else
            {
                txtName.Text = txtMobile.Text = txtEmail.Text = "";
                ddlId.SelectedIndex = 0;
            }
        }

        protected void btnUpdate_Click(object sender, EventArgs e)
        {
            con.Open();
            cmd.CommandText = "TestUpdate_Delete";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Name", txtName.Text);
            cmd.Parameters.AddWithValue("@Mobile", txtMobile.Text);
            cmd.Parameters.AddWithValue("@Email", txtEmail.Text);
            cmd.Parameters.AddWithValue("@Id", ddlId.SelectedValue);
            int count = cmd.ExecuteNonQuery();
            if (count > 0)
                Response.Write("Data Updated Successfully");
            con.Close();
        }

        protected void btnDelete_Click(object sender, EventArgs e)
        {
            con.Open();
            cmd.CommandText = "TestUpdate_Delete";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Id", ddlId.SelectedValue);
            int count = cmd.ExecuteNonQuery();
            if (count > 0)
                Response.Write("<script>alert('Are you sure of deleting this record!</Script>");
            con.Close();
        }
    }
}

Richard MacCutchan

Вам нужно получить значения из текстового поля и выпадающего списка и передать их в SP. В чем же проблема?

Member 14534831

Я хочу обновить данные в базе данных .
пример: dropdownlist выбранное значение -> 1
данные будут отображаться в текстовом поле следующим образом
ID - 1( ddlId.selectedValue)
Имя - Наг
Мобильный телефон - 9876543213
Электронная почта - nag135@gmail.com
Обновление(btn) удаление (btn)
когда я нажимаю кнопку Обновить для выбранного значения выпадающего списка , данные будут обновляться и храниться в базе данных
Точно так же , когда я нажимаю кнопку Удалить для выбранного значения выпадающего списка, данные удаляются в базе данных

1 Ответов

Рейтинг:
2

Vincent Maverick Durano

Во-первых, вы никогда не должны жестко кодировать строку подключения к базе данных. Вместо этого определите строку подключения в web.config и ссылайтесь на значение оттуда. Видеть: Создание строки подключения и работа с SQL Server LocalDB | Microsoft Docs[^]

Например:

<connectionStrings>
  <add name="MyDBConnectionString" connectionString="Data Source=.\\SQLEXPRESS;Database=sample3;Integrated Security=true" providerName="System.Data.SqlClient" />
</connectionStrings>


Затем вы можете ссылаться на значение строки подключения через ConfigurationManager класс вроде этого:

string dbConnectionString = ConfigurationManager.ConnectionStrings["MyDBConnectionString"].ConnectionString;


Во-вторых, я видел, что вы добавили значение из вашего DropDownList непосредственно к вашему SQL - запросу, который потенциально может привести вас к SQL-инъекции. Вы никогда не должны добавлять значения непосредственно к вашему SQL-запросу, даже если это значение получено из DropDownList Вместо этого всегда используйте SQL paramterize query. Видеть: Защитите свои данные: предотвратите SQL-инъекцию[^]

Вот вам пример:

private void PopulateForm(int id){
	using (SqlConnection connection = new SqlConnection(GetDBConnectionString())) {
                using (SqlCommand cmd = new SqlCommand("SELECT * FROM test WHERE Id= @Id", connection)) {
                        connection.Open();
 			cmd.CommandType = CommandType.Text;
            		cmd.Parameters.AddWithValue("@Id", id);
			SqlDataReader rdr = cmd.ExecuteReader();

        		while (rdr.Read())
        		{
            			txtName.Text = dr["Name"].ToString();
                    		txtMobile.Text = dr["Mobile"].ToString();
                    		txtEmail.Text = dr["Email"].ToString();
        		}
                }
 	}
}

protected void ddlId_SelectedIndexChanged(object sender, EventArgs e){
	PopulateForm(Convert.ToInt32(ddlId.SelectedValue));
}


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

В-четвертых, заведите привычку класть предметы, которые едят ресурсы, такие как SqlConnection, SqlCommand в using block чтобы убедиться, что объекты будут правильно утилизированы и после того, как они будут использованы.

Наконец, я бы рекомендовал вам отделить свой код/логику для обновления /удаления данных в базу данных и держать их подальше от вашего компьютера. Button нажмите кнопку событие для удобства обслуживания и разделения проблем.

Теперь ваш код обновления и удаления должен быть примерно таким:

private string GetDBConnectionString(){
 return ConfigurationManager.ConnectionStrings["MyDBConnectionString"].ConnectionString;
}


private void UpdateRecord(int id, string name, string email, string mobile){

	using (SqlConnection connection = new SqlConnection(GetDBConnectionString())) {
                using (SqlCommand cmd = new SqlCommand("YourUpdateStoredProcedureName", connection)) {

                        connection.Open();
 			cmd.CommandType = CommandType.StoredProcedure;
			cmd.Parameters.AddWithValue("@Name", name);
            		cmd.Parameters.AddWithValue("@Mobile", mobile);
            		cmd.Parameters.AddWithValue("@Email", email);
            		cmd.Parameters.AddWithValue("@Id", id);
			cmd.ExecuteNonQuery();
                }
 	}
}

private void DeleteRecord(int id){
	using (SqlConnection connection = new SqlConnection(GetDBConnectionString())) {
                using (SqlCommand cmd = new SqlCommand("YourDeleteStoredProcedureName", connection)) {
                        connection.Open();
 			cmd.CommandType = CommandType.StoredProcedure;
            		cmd.Parameters.AddWithValue("@Id", id);
			cmd.ExecuteNonQuery();
                }
 	}
}


Затем вы можете назвать эти методы примерно так:

protected void btnUpdate_Click(object sender, EventArgs e){
        UpdateRecord(Convert.ToInt32(ddlId.SelectedValue), txtName.Text, txtEmail.Text, txtMobile.Text);
}

protected void btnUpdate_Click(object sender, EventArgs e){
        DeleteRecord(Convert.ToInt32(ddlId.SelectedValue));
}


Member 14534831

Я пробовал ваш код , но eventhough я получил ошибку в обработчике событий dropdownlist.

будете ли вы загружать код внутри обработчика событий ddlId_SelectedIndexChanged

Vincent Maverick Durano

Я обновил решение. См. метод PopulateForm() из решения.

Member 14534831

Я пробовал код populateform, но он отображает только ID в выпадающем списке, не будет отображать выбранные данные в текстовые поля(имя,мобильный телефон,электронная почта)

Vincent Maverick Durano

Вы должны отладить свой код. Установите точку останова в SelectedIndexChanaged и войдите в свой код, чтобы выяснить, что пошло не так. Кроме того, вы установили AutoPostback в True для своего выпадающего списка?

Member 14534831

Я пытался, но не смог получить данные.

Я столкнулся с проблемой в другой программе вы дадите решение -

[веб-дизайн]


Введите имя студента &ЛТ;АСП:текстовое поле с ID="txtName" атрибут runat="сервер"и GT; введите номер студента &ЛТ;АСП:текстовое поле с ID="txtNumber" атрибут runat="сервер"и GT; ввести студента в процентах &ЛТ;АСП:текстовое поле с ID="txtPercentage" атрибут runat="server"и&ГТ; &ЛТ;АСП:кнопка ID="кому btnsave" атрибут runat="сервер" текст="сохранить" функция onclick="btnSave_Click"&ГТ;
&ЛТ;как ASP:dropdownlist с ИД="ddlSNum" атрибут runat="сервер" autopostback элемента управления="истинный" onselectedindexchanged="ddlSNum_SelectedIndexChanged"&ГТ;
<asp:listitem>---выберите SNum ---

&ЛТ;в ASP:GridView в идентификатор="gvTest" атрибут runat="сервер"и GT;

-----

[исходный код]

использование системы;
использование системы.Коллекции.Общий;
использование System.Linq;
использование системы.Сеть;
использование System.Web.UI;
используя системы.Веб.Пользовательского интерфейса.WebControls;
использование System.Data;
используя системы.Данных.Поставщики sqlclient;
использование системы.Конфигурация;
тест пространства имен
{
общественный разделяемого класса SystemTest1 : система.Веб.Пользовательского интерфейса.Страницы
{
SqlConnection con;
Команда sqlcommand cmd в;
SqlDataReader dr;
охраняемых недействительными в(объект отправителя, EventArgs в электронной)
{
con = new SqlConnection(GetDBConnectionString());
команду cmd = новый sqlcommand, который();
УМК.Подключение = кон;
против.Открыть();
УМК.CommandText = "выберите S_Number из S_Test";
dr = cmd.Метода executereader();
ддлснум.Источник данных = dr;
ддлснум.DataTextField = "S_Number";
ddlSNum.DataValueField = "S_Number";
ддлснум.Привязку();
ддлснум.Предметы.Insert(0, "--- Select SNum ---");
против.Закрывать();
}
частная строка GetDBConnectionString()
{
верните ConfigurationManager.ConnectionStrings["SagarDBCS"].ConnectionString;
}


охраняемых недействительными btnSave_Click(объект отправителя, EventArgs в электронной)
{
УМК.CommandText = $"вставить в значения S_Test(S_Name,S_Number,S_Percentage) ('{txtName.Текст}',{txtNumber.Текст},{txtPercentage.Текст})";
против.Открыть();
int count = cmd.Метод executenonquery();
if (count > 0)
Ответ.Write("Данные Вставлены Успешно");
txtName.Text = txtNumber.Text = txtPercentage.Текст = "";
против.Закрывать();
}
частный недействительными DropDownData(инт S_Number)
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["SagarDBCS"].ConnectionString))
{
используя (команда sqlcommand cmd и = новая команда sqlcommand("Select * из S_Test где S_Number=" + ddlSNum.SelectedValue, con))
{
против.Открыть();
dr = cmd.Метода executereader();
если(dr.Read())
{
txtName.Text = dr["S_Name"].Метод toString();
txtNumber.Текст = доктор["S_Number"].Метод toString();
txtPercentage.Текст = доктор["S_Percentage"].Метод toString();
}
против.Закрывать();
}
}
}

охраняемых недействительными ddlSNum_SelectedIndexChanged(объект отправителя, EventArgs в электронной)
{
DropDownData(Конвертировать.ToInt32(ddlSNum.SelectedValue));
gvTest.Источник данных = д-р;
gvTest.DataBind();
}
}
}

Vincent Maverick Durano

Похоже, вы не испробовали то, что я предложил. Мы здесь не для того, чтобы кого-то кормить с ложечки. Вы должны сначала понять предлагаемое решение, а затем применить его.