Member 12605293 Ответов: 2

Хранимая процедура для CRUD, имя proc не найдено, когда я вызываю код позади


Привет , я новичок в sql, я хочу связать свою таблицу в одном SP и сделать вызов в проекте.

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

Create PROCEDURE [gvempdetails]

     @Action VARCHAR (10),
     @EMPLOYEEID INT ,
     @EMPLOYEENAME VARCHAR(100)= NULL ,
     @DEPARTMENT VARCHAR(100)= NULL ,
     @AGE VARCHAR(30)= NULL,
     @SALARY INT = NULL
     
AS
BEGIN
      SET NOCOUNT ON 
     IF @Action = 'SELECT'
      BEGIN
      SELECT EmpId,EmpName,Dep,Age,Sal
      FROM gvdetails17
       END
       
     IF @Action='INSERT'
       BEGIN
       INSERT INTO gvdetails17(EmpId,EmpName,Dep,Age,Sal) VALUES(@EMPLOYEEID,@EMPLOYEENAME,@DEPARTMENT,@AGE,@SALARY)
        END       
            
     IF @Action ='UPDATE'
      BEGIN
      UPDATE gvdetails17 SET EmpName=@EMPLOYEENAME,Dep=@DEPARTMENT,Age=@AGE,Sal=@SALARY WHERE EmpId=@EMPLOYEEID
      END
      
      
     IF @Action='DELETE'
      BEGIN
      DELETE FROM gvdetails17 where EmpId=@EMPLOYEEID
      END
      SET NOCOUNT OFF
      END
<pre lang="c#"><pre>SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlconnection"].ConnectionString);
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                bind();
                BindAge();
                BindSalary();
            }
        }
        protected void bind()
        {
            cn.Open();
            SqlCommand cmd = new SqlCommand("Select * from [gvempdetails]", cn);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            cn.Close();
            if (ds.Tables[0].Rows.Count > 0)
            {
                gvDetails.DataSource = ds;
                gvDetails.DataBind();
            }
            else
            {
                ds.Tables[0].Rows.Add(ds.Tables[0].NewRow());
                gvDetails.DataSource = ds;
                gvDetails.DataBind();
                int columncount = gvDetails.Rows[0].Cells.Count;
                gvDetails.Rows[0].Cells.Clear();
                gvDetails.Rows[0].Cells.Add(new TableCell());
                gvDetails.Rows[0].Cells[0].ColumnSpan = columncount;
                gvDetails.Rows[0].Cells[0].Text = "Enter the details";
            }
        }

        protected void ddlAge_SelectedIndexChanged(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();


            cn.Open();
            if (ddlAge.SelectedValue != "")
            {
                string[] ages = ddlAge.SelectedValue.Split('-');
                string from = ages[0];
                string to = ages[1];

                SqlCommand cmd = new SqlCommand("select * from [gvempdetails] WHERE @AGE between  @from and @to", cn);
                cmd.Parameters.AddWithValue("@from", from);
                cmd.Parameters.AddWithValue("@to", to);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }

            else
            {
                SqlCommand cmd = new SqlCommand("select * from [gvempdetails]", cn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            cn.Close();
            gvDetails.DataSource = dt;
            gvDetails.DataBind();
        }

        protected void gvDetails_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName.Equals("Add"))
            {
                TextBox txtEmpId = (TextBox)gvDetails.FooterRow.FindControl("txtempid");
                TextBox txtEmpName = (TextBox)gvDetails.FooterRow.FindControl("txtempname1");
                TextBox txtEmpDep = (TextBox)gvDetails.FooterRow.FindControl("txtdep1");
                TextBox txtAge = (TextBox)gvDetails.FooterRow.FindControl("txtage1");
                TextBox txtSal = (TextBox)gvDetails.FooterRow.FindControl("txtsal1");

                cn.Open();
                SqlCommand cmd =
                new SqlCommand(
                "Insert into [gvempdetails](@EMPLOYEEID,@EMPLOYEENAME,@DEPARTMENT,@AGE,@SALARY) values('" + txtEmpId.Text + "','" + txtEmpName.Text + "','" +
                txtEmpDep.Text + "','" + txtAge.Text + "','" + txtSal.Text + "')", cn);
                int result = cmd.ExecuteNonQuery();
                cn.Close();
                if (result == 1)
                {
                    bind();
                    
                }
                else
                {
                    
                }
            }
        }

        protected void gvDetails_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            int EmpId = Convert.ToInt32(gvDetails.DataKeys[e.RowIndex].Values["EmpId"].ToString());
            string username = gvDetails.DataKeys[e.RowIndex].Values["EmpName"].ToString();
            cn.Open();
            SqlCommand cmd = new SqlCommand("Delete from [gvempdetails] where @EMPLOYEEID=" + EmpId, cn);
            int result = cmd.ExecuteNonQuery();
            cn.Close();
            if (result == 1)
            {
                bind();

                //lblresult.Text = username + " details deleted successfully";
            }
        }
        protected void gvDetails_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            int EmpId = Convert.ToInt32(gvDetails.DataKeys[e.RowIndex].Value.ToString());
            string username = gvDetails.DataKeys[e.RowIndex].Values["EmpName"].ToString();
            TextBox txtDep = (TextBox)gvDetails.Rows[e.RowIndex].FindControl("txtdep");
            TextBox txtAge = (TextBox)gvDetails.Rows[e.RowIndex].FindControl("txtage");
            TextBox txtSal = (TextBox)gvDetails.Rows[e.RowIndex].FindControl("txtsal");

            cn.Open();
            SqlCommand cmd = new SqlCommand("Update [gvempdetails] set @DEPARTMENT='" + txtDep.Text + "',@AGE='" + txtAge.Text + "',@SALARY='" + txtSal.Text + "' where @EMPLOYEEID=" + EmpId, cn);
            cmd.ExecuteNonQuery();
            cn.Close();

            // lblresult.Text = username + " Details Updated successfully";
            gvDetails.EditIndex = -1;
            bind();
        }
        protected void gvDetails_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gvDetails.EditIndex = -1;
            bind();
        }
        protected void gvDetails_RowEditing(object sender, GridViewEditEventArgs e)
        {
            gvDetails.EditIndex = e.NewEditIndex;
            bind();
        }
        protected void gvDetails_OnRowDataBound(object sender, GridViewRowEventArgs e)
        {


        }
        protected void BindAge()
        {
            DataTable dt = new DataTable();
            cn.Open();
            SqlCommand cmd = new SqlCommand("Select * from Age", cn);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            //DataSet ds = new DataSet();
            da.Fill(dt);
            cn.Close();
            ddlAge.DataSource = dt;
            ddlAge.DataTextField = "Age";
            ddlAge.DataValueField = "Age";
            ddlAge.DataBind();
            ddlAge.Items.Insert(0, new ListItem("--Select--"));

        }
        protected void BindSalary()
        {
            DataTable dt = new DataTable();
            cn.Open();
            SqlCommand cmd = new SqlCommand("Select * from Salary1", cn);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            //DataSet ds = new DataSet();
            da.Fill(dt);
            cn.Close();
            ddlAddSalary1.DataSource = dt;
            ddlAddSalary1.DataTextField = "Salary";
            ddlAddSalary1.DataValueField = "Salary";
            ddlAddSalary1.DataBind();
            ddlAddSalary1.Items.Insert(0, new ListItem("--Select--"));

        }

        protected void ddlAddSalary1_SelectedIndexChanged1(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            cn.Open();
            if (ddlAddSalary1.SelectedValue != "")
            {
                string[] sal = ddlAddSalary1.SelectedValue.Split('-');
                string from = sal[0];
                string to = sal[1];

                SqlCommand cmd = new SqlCommand("Select * from [gvempdetails] WHERE @SALARY between  @from and @to", cn);
                cmd.Parameters.AddWithValue("@from", from);
                cmd.Parameters.AddWithValue("@to", to);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }

            else
            {
                SqlCommand cmd = new SqlCommand("select * from [gvempdetails]", cn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            cn.Close();
            gvDetails.DataSource = dt;
            gvDetails.DataBind();
        }
        protected void OnSelectedIndexChanged(object sender, EventArgs e)
        {
            //txtEmpId.Text = gvDetails.SelectedRow.Cells[0].Text;
            //lblempname.Text = gvDetails.SelectedRow.Cells[1].Text;
            //lbldep.Text = gvDetails.SelectedRow.Cells[2].Text;
            //lblage.Text = gvDetails.SelectedRow.Cells[3].Text;
            //lblsal.Text = gvDetails.SelectedRow.Cells[4].Text;

            
        }
        protected void OnPaging(object sender, GridViewPageEventArgs e)
        {
            gvDetails.PageIndex = e.NewPageIndex;
            this.bind();

        }
    }

}

Er. Puneet Goel

В чем именно заключается проблема? Вы хотите знать, как вызвать SP в проекте?

Member 12605293

Привет Пунит,
Спасибо за Ваш быстрый ответ,я хочу знать, как обернуть все эти таблицы в один SP

Er. Puneet Goel

хорошо, Я помогу Вам, Можете ли вы сказать, какие 3 sql-запроса вы хотите преобразовать в proc и использовать его ? В программировании есть несколько запросов с DML-операции.

Member 12605293

Привет Пунит
Вот что я попробовал
Создать процедуру [gvempdetails]

@Action VARCHAR (10),
@EMPLOYEEID INT ,
@EMPLOYEENAME VARCHAR(100)= NULL ,
@DEPARTMENT VARCHAR(100)= NULL ,
@AGE VARCHAR(30)= NULL,
@ЗАРАБОТНОЙ ПЛАТЫ ИНТ = НУЛЬ

АС
НАЧАТЬ
УСТАНОВИТЕ NOCOUNT ON
Если @Action = 'SELECT'
НАЧАТЬ
Выберите empid в,столбец empname,ДЭП,возраст,Сал
От gvdetails17
КОНЕЦ

IF @Action= 'INSERT'
НАЧАТЬ
Вставить в gvdetails17(empid в,столбец empname,ДЭП,возраст,Сал) значения(@КОДСОТРУДНИКА,@EMPLOYEENAME, отдел@,@возраст,@заработной платы)
КОНЕЦ

Если обновление @действии =''
НАЧАТЬ
Gvdetails17 обновление установить столбец empname=@EMPLOYEENAME,кафедра отд=@, лет=@возраст,Сэл=@зарплата где empid в=@employeeid не
КОНЕЦ


Если @Action= 'удалить'
НАЧАТЬ
Удалить из gvdetails17, где EmpId=@EMPLOYEEID
КОНЕЦ
УСТАНОВИТЬ NOCOUNT OFF
КОНЕЦ

Er. Puneet Goel

Работает ли sp нормально, когда вы его выполняете ?

Er. Puneet Goel

Проблема заключается в том, что "SqlCommand cmd = new SqlCommand ("Select * from [gvempdetails]", cn);"
Вы не называете процедуру таким образом.

Member 12605293

хорошо, я исправил это, но теперь эта процедура или функция ожидает paramenter, который iis не поставляется.Я знаю, что использовал paramenter (@Action) для вставки,обновления, удаления.Но я не знаю, как передать этот входной параметр

Member 12605293

охраняемых недействительными привязать()
{
спицы.Открыть();
SqlCommand cmd = new SqlCommand ("gvempdetails", cn);
УМК.CommandType = CommandType.Хранимая процедура;
SqlDataAdapter da = новый SqlDataAdapter(cmd);
DataSet ds = новый набор данных();
да.Заполнить(ДС);
спицы.Рядом();
если (ДС.Таблицы[0].Строк.Граф > 0)
{
gvDetails.Источник данных = ds;
gvDetails.Привязку();
}
ещё
{
ДС.Таблицы[0].Строк.Добавить(ДС.Таблицы[0]. NewRow());
gvDetails.Источник данных = ds;
gvDetails.Привязку();
инт свойств = gvDetails.Строки[0].Ячейки.Рассчитывать;
gvDetails.Строки[0].Ячейки.Четкий();
gvDetails.Строки[0].Ячейки.Добавить (новая табличная ячейка());
gvDetails.Строки[0].Ячейки[0].Columnspan значение = свойств;
gvDetails.Строки[0].Ячейки[0].Text = " введите данные";
}
}

охраняемых недействительными ddlAge_SelectedIndexChanged(объект отправителя, EventArgs в электронной)
{
DataTable dt = новый DataTable();


спицы.Открыть();
если (ddlAge.SelectedValue != "")
{
string[] ages = ddlAge.Выбранное значение.Расщеплять('-');
строка from = ages[0];
строка = возраст[1];

Команда sqlcommand cmd и = новая команда sqlcommand("выбрать * из [gvempdetails], где @возраст между @и @к", СП);
УМК.CommandType = CommandType.Хранимая процедура;
УМК.Параметры.AddWithValue("@С", от);
УМК.Параметры.AddWithValue ("@to", to);
SqlDataAdapter da = новый SqlDataAdapter(cmd);
да.Заполнить(ДТ);
}

ещё
{
SqlCommand cmd = new SqlCommand ("select * from [gvempdetails]", cn);
УМК.CommandType = CommandType.Хранимая процедура;
SqlDataAdapter da = новый SqlDataAdapter(cmd);
да.Заполнить(ДТ);
}
спицы.Рядом();
gvDetails.Источник данных = dt;
gvDetails.Привязку();
}

охраняемых недействительными gvDetails_RowCommand(объект отправителя, GridViewCommandEventArgs е)
{
если (электронная.Имя_команды."Равно" ("Добавить"))
{
TextBox txtEmpId = (TextBox)gvDetails.FooterRow.FindControl ("txtempid");
TextBox txtEmpName = (TextBox)gvDetails.FooterRow.FindControl ("txtempname1");
TextBox txtEmpDep = (TextBox)gvDetails.FooterRow.FindControl ("txtdep1");
TextBox txtAge = (TextBox)gvDetails.FooterRow.FindControl ("txtage1");
TextBox txtSal = (TextBox)gvDetails.FooterRow. FindControl ("txtsal1");

спицы.Открыть();
SqlCommand cmd =
новая команда SqlCommand(
"Вставить в [gvempdetails](@EMPLOYEEID,@EMPLOYEENAME,@DEPARTMENT,@AGE,@SALARY) значения('" + txtEmpId.Текст + "', '" + txtEmpName.Текст + "','" +

txtEmpDep.Текст + "', '" + txtAge.Текст + "', '" + txtSal.Текст + "')", cn);
УМК.CommandType = CommandType.Хранимая процедура;
int result = cmd.Метод executenonquery();
спицы.Рядом();
если (результат == 1)
{
связывать();

}
ещё
{

}
}
}

охраняемых недействительными gvDetails_RowDeleting(объект отправителя, GridViewDeleteEventArgs е)
{
int EmpId = преобразовать.ToInt32(gvDetails.DataKeys[e.Параметр rowindex].Значения["Empid В"].Метод toString());
строка username = gvDetails.DataKeys[e.Параметр rowindex].Значения["Столбец Empname"].Метод toString();
спицы.Открыть();
Команда sqlcommand cmd и = новая команда sqlcommand("удалить с [gvempdetails], где @КОДСОТРУДНИКА=" + empid в, спицы);
int result = cmd.Метод executenonquery();
спицы.Рядом();
если (результат == 1)

Er. Puneet Goel

посмотрите на него ?? http://net-informations.com/csprj/data-providers/cs-procedure-parameter.htm

Karthik_Mahalingam

публикуйте только соответствующий код..

Member 12605293

Привет Картик
Я обновил вопрос.

2 Ответов

Рейтинг:
0

ejazwaquif

Привет,

Ваша хранимая процедура кажется хорошей, но требует определенных изменений в соответствии с вашим кодом.

Давайте возьмем по одному:

1. функция Bind () :-

Здесь вы должны изменить этот код

cn.Open();
            //SqlCommand cmd = new SqlCommand("Select * from [gvempdetails]", cn);
            //SqlDataAdapter da = new SqlDataAdapter(cmd);
            //DataSet ds = new DataSet();
            //da.Fill(ds);
            //cn.Close();

to - 
            cn.Open();
            SqlCommand cmd = new SqlCommand("gvempdetails", cn);
            cmd.CommandType = CommandType.StoredProcedure;
	    cmd.Parameters.AddWithValue("@Action","SELECT");
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            cn.Close();


2. Функция ddlAge_SelectedIndexChanged
Как кажется здесь, вы хотите отфильтровать сотрудника по возрасту между вашим диапазоном, то есть от и до
Поскольку вы хотите использовать эти параметры в хранимой процедуре (SP) , вы должны принять их в качестве входных параметров в SP
Нравится :
@Action VARCHAR (10),
@EMPLOYEEID INT ,
@EMPLOYEENAME VARCHAR(100)= NULL ,
@DEPARTMENT VARCHAR(100)= NULL ,
@AGE VARCHAR(30)= NULL,
@SALARY INT = NULL,
@FrOM INT = NULL,
@TO INT = NULL


и нужно добавить еще одно действие для этого как
IF @Action = 'SELECTAGE'
BEGIN
SELECT EmpId,EmpName,Dep,Age,Sal where age >= @FROM and age <= @TO
FROM gvdetails17
 END


Теперь код codebehid,
cn.open();
SqlCommand cmd = new SqlCommand("gvempdetails", cn);
        cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@ACTION", "SELECTAGE");
        cmd.Parameters.AddWithValue("@FROM", from);
        cmd.Parameters.AddWithValue("@TO", to);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);



Я надеюсь, что вы поймете на приведенном выше примере, как использовать хранимую процедуру из кода

просто для информации,
При создании объекта SqlCommand нам нужно передать commandText и соединение.
Таким образом, в случае SP вы должны передать только имя SP в качестве commandText в нашем случае "gvempdetails"
а все остальное вы должны передать как параметр типа @ACTION,@FROM в нашем случае.
в вашей хранимой процедуре вы, возможно, заметили, что некоторые параметры инициализируются с помощью NULL, например @SALARY INT = NULL
Здесь NULL используется для того чтобы сделать параметр необязательным в противном случае вам придется передавать этот параметр при всех вызовах
По последнему предложению - @Action VARCHAR (10) здесь, в типе параметров действия, вы должны взять по крайней мере 30 символов, потому что есть шанс
вы должны принять имя действия как длинную строку типа 'SELECTAGEBYRANGE'

Надеюсь, это вам поможет!

Спасибо,
Эджаз Вакиф


Member 12605293

Привет Эджаз
В методе bind () я получаю сообщение об ошибке: "процедура или функция 'gvempdetails' ожидает параметр '@Action', который не был указан."
Примечание: я использовал предложенный вами код bind()

ejazwaquif

Привет,
Извините, я забыл упомянуть здесь одну вещь, которая может быть причиной этой проблемы.
Пожалуйста, добавьте эту строку:

cmd.CommandType = CommandType.StoredProcedure;

like this,
cn.Open();
            SqlCommand cmd = new SqlCommand("gvempdetails", cn);
            cmd.CommandType = CommandType.StoredProcedure;
	    cmd.Parameters.AddWithValue("@Action","SELECT");
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            cn.Close();


Надеюсь, это решит проблему.

Спасибо,
Эджаз Вакиф

Рейтинг:
0

angappans

Привет.,

Для Sql вы создаете процедуру хранения с входными / выходными параметрами. для этих входных параметров у вас есть переменная типа declare. в зависимости от того, какой тип запросов вы будете писать.

например

создайте процедуру sp_test(@type varchar(100), @testname varchar (100)=null, @testaddress varchar(100))
как
начать
if (@type= 'I')
начать
вставить в testtable (testname,testaddress) значения (@testname,@testaddress)
конец
if (@type= 'SA')
начать
выберите testaddress из testtable
конец
конец

из приведенной выше процедуры вы должны будете передать тип, после чего вы вернете результат запроса.

В переднем конце (Asp.net) вместо запроса вы передадите имя процедуры хранения.

Надеюсь, вы его получите..

Спасибо