LuQman Asif Ответов: 3

Как добавить данные в хранимую процедуру в SQL server с помощью языка C#


я хочу добавить запись в базу данных с помощью C#. но когда я нажимаю на кнопку "Добавить", появляется окно сообщения с сообщением, что
Employee Record could not be added!!!!"


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

<pre> //methode
string qry = "execute insertemplab @Employee_id,@Emplyee_name,@Emplyee_phone,@Employee_address,@Employee_type,@clothmanufacture";
            
            SqlConnection connection = getconnection();
            SqlCommand command = new SqlCommand(qry, connection);
            command.CommandType = CommandType.StoredProcedure;
          command.Parameters.AddWithValue("@Employee_ID", lab.Employee_ID);
            command.Parameters.AddWithValue("Emplyee_Name", lab.EmployeeName);
            command.Parameters.AddWithValue("@Emplyee_phone", lab.PhoneNumber);
            command.Parameters.AddWithValue("@Employee_Address", lab.EmployeeAddress);
            command.Parameters.AddWithValue("@Employee_Type", lab.EmployeType);
            command.Parameters.AddWithValue("@clothmanufacture", lab.ClothManufactured);
            
            try{
                command.ExecuteNonQuery();
                
                MessageBox.Show("Employee Record Added Successfully");
            }
            catch (SqlException ex)
            {
                MessageBox.Show("Employee Record could not be added!!!!");
            }



        }

//при нажатии на кнопку Добавить
LaboureClass lab = new LaboureClass(txtlaboureID.Text, txtname.Text, txtphone.Text, txtaddress.Text, txttype.Text, int.Parse(txtmanufacture.Text));
            
           
            DBconnect.addEmployerecord(lab);

//это моя процедура в SQL server
create proc insertemplab @Employee_id varchar(50), @Emplyee_name varchar(50), 
 @Emplyee_phone varchar(50),  @Employee_address varchar(50),  @Employee_type varchar(50),@clothmanufacture varchar(50)
as
begin 
insert into Employee_tbl(Employee_id,Emplyee_name,Emplyee_phone,Employee_address,Employee_type) values(@Employee_id, @Emplyee_name,  @Emplyee_phone,  @Employee_address,  @Employee_type)
insert into Labour_tbl(L_Employee_id,clothmanufacture) values(@Employee_id,@clothmanufacture)

end 

3 Ответов

Рейтинг:
9

MadMyche

Однако на самом деле способ выяснить, что происходит, - это использовать отладчик и посмотреть, что происходит, что вызывает исключение SqlException; вы назначаете исключение для ex переменная, но вы на самом деле ничего с ней не делаете.
Так что поставьте точку останова в Ате catch постройте и посмотрите, что такое фактическое исключение SqlException.

Есть 2 возможности с места в карьер:
1. EXECUTE предполагается, что ваша команда SqlCommand имеет тип CommandText.StoredProcedure

2. Типы Данных. Все переменные в SP определяются как VARCHAR(50), а передаваемое значение "clothmanufacture" является целым числом. Совпадают ли типы данных в схеме таблицы с объявлениями переменных SP?


LuQman Asif

все типы данных в SP являются varchar(50), но varchar может принимать любой тип значения. разве это не правда?

MadMyche

И да, и нет. Ваши типы должны совпадать на всем пути от C# до SP и табличной схемы.
И после дальнейшего рассмотрения.. Я думаю, что это сама команда SqlCommand; это должно быть только имя SP, никаких параметров или выполнения там быть не должно.

LuQman Asif

вы правы, я изменил это. я отлаживаю его и теперь появляется эта ошибка
Процедура или функция 'insertemplab' ожидает параметр '@Employee_type', который не был указан.

MadMyche

Если значение, которое вы пытаетесь передать, не было определено, параметр не будет присоединен. Он должен быть либо (1) явно определен как dbNull, либо (2) значение по умолчанию должно быть определено в SP.
Но похоже ты уже позаботился об этом

Рейтинг:
21

Rob Philpott

Ну, к сожалению, Ваш код ловит ошибку и избавляется от нее, так что в блоке catch ваше окно сообщения будет лучше возвращать ex.Message.

Но то, как вы называете свой процесс, необычно. Обычно SQL - это просто имя proc с командой.CommmandType устанавливается в SP, как вы уже сделали.

Что происходит, когда вы делаете это:

string qry = "insertemplab";


Я предполагаю, что ваши имена параметров совпадают с именами сохраненного процесса.

EDIT: возможно, Вам также захочется подумать об удалении вашего соединения и команды, в зависимости от того, что обеспечивает функция getConnection ().


Рейтинг:
17

OriginalGriff

Начните с отладчика: поставьте точку останова на линию:

MessageBox.Show("Employee Record could not be added!!!!");

Запустите приложение еще раз, а когда оно остановится, посмотрите на объект исключения ex чтобы выяснить, в чем заключается заявленная проблема. Затем используйте отладчик, чтобы посмотреть на передаваемые данные и использовать ошибку, чтобы помочь вам понять, что это такое.

Мы не можем сделать ничего из этого для вас: у нас нет доступа к вашему коду во время его выполнения, у нас нет ваших данных в текстовых полях, у нас нет вашего LaboureClass, и у нас нет вашей базы данных, чтобы попробовать его.
Дайте ему попробовать, и посмотреть, сколько информации вы можете узнать!


LuQman Asif

Не удалось найти хранимую процедуру 'execute insertemplab @Employee_id,@Emplyee_name,@Emplyee_phone,@Employee_address,@Employee_type,@clothmanufacture'.
это сообщение появляется, когда я отлаживаю, применяя break

OriginalGriff

И это говорит вам все, что вам нужно знать...
Когда вы хотите создать хранимую процедуру, она определяет параметры, а не код yoru C#.
Заменить этот:

строка qry = "execute insertemplab @Employee_id,@Emplyee_name,@Emplyee_phone,@Employee_address,@Employee_type,@clothmanufacture";

С этим:

строка qry = "insertemplab";

И попробуй еще раз.

LuQman Asif

Процедура или функция 'insertemplab' ожидает параметр '@Employee_type', который не был указан.

теперь это появляется на debbuging.

OriginalGriff

Поэтому проверьте свой лабораторный объект и посмотрите, что находится в lab.EmployeType
На первый взгляд, это null - вероятно, потому, что у вас есть два объекта с похожими именами, и тот, который вы используете, написан с ошибкой...

LuQman Asif

да, когда я отлаживаю его, он равен нулю. а теперь скажи мне, как я могу ее решить.

OriginalGriff

"Не ставьте в него нуль".

Давай - думай. У меня нет доступа к вашему коду, запущенному или нет, поэтому я не могу сказать: "сделай это, и он это исправит".
Вы знаете, что является симптомом проблемы - lab.EmployeType равен null - так почему же он равен null? Где в вашем коде вы его устанавливаете? Чем вы его устанавливаете? Что показывает отладчик, когда вы смотрите на это? Есть ли у вас еще одно свойство или поле в LaboureClass под названием lab.EmployeeType, которое вы устанавливаете в значение? Если да, то почему у вас есть два объекта недвижимости с такими похожими названиями? Какой из них вы намеревались установить? Чтобы использовать?
Я не могу ответить на них за тебя!

LuQman Asif

извините, что беспокою вас так сильно. я дал значение по умолчанию null каждому полю в классе laboure, теперь я удалю его и попробую еще раз. я очень напряжен, потому что должен представить этот проект завтра. пожалуйста, помогите мне до тех пор, пока этот вопрос не разрешится.

OriginalGriff

Остановитесь и подумайте, а не пробуйте что-то наугад.
Если вы добавите свойство ссылочного типа (т. е. не число или bool), оно по умолчанию будет равно null, если только вы не зададите ему что-то другое. Итак, где именно в вашем коде вы устанавливаете свойству EmployeType (или полю) ненулевое значение?
Вы поставили точку останова на нем, чтобы точно выяснить, что вы устанавливаете? Если нет, то почему? Отладчик попал в ваш код назначения? Если нет, то почему? Подумайте о том, что вы делаете - мы не можем сделать ничего из этого для вас, так как мы не можем запустить ваш код, и эти проблемы возникают только во время его работы. У вас есть отладчик - используйте его!

LuQman Asif

спасибо, братан, за твою помощь, наконец-то он работает. Большое спасибо

OriginalGriff

Всегда пожалуйста!