UDTWS Ответов: 1

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


мой стол выглядит вот так
create table tbl_user
(
userID int Primary Key identity (1,1),
userName varchar(20),
pass varchar(30),
email varchar(50),
userRole int,
userPhoto varchar(100),
userStatus int,
);


//my store procedure is 
create PROCEDURE spCreateUser
	@userName varchar(20),
	@pass varchar(30),
	@email varchar(50),
	@userRole int,
	@userPhoto varchar(100),
	@userStatus int,
	@result int output
AS
BEGIN 
	IF EXISTS(SELECT * FROM tbl_user WHERE userName= @userName)
		SET @result = 1
	ELSE
	BEGIN
		SET @result = 0 
		INSERT INTO tbl_user(userName,pass,email,userRole,userPhoto,userStatus)
		VALUES(@userName,@pass,@email,@userRole,@userPhoto,@userStatus)
	END
	return @result
END


asp.net вот такой код на c#
protected void btn_insert_Click(object sender, EventArgs e)
    {
        string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
         string path = string.Concat(Server.MapPath("~/UploadFile/" + fu_photo.FileName));
         fu_photo.SaveAs(path);
         using (SqlConnection con = new SqlConnection(CS))
         {
             SqlCommand cmd = new SqlCommand("spCreateUser", con);
             cmd.CommandType = CommandType.StoredProcedure;
             
             cmd.Parameters.AddWithValue("userName", txt_username.Text);
             cmd.Parameters.AddWithValue("pass", txt_pass.Text);
             cmd.Parameters.AddWithValue("email", txt_email.Text);
             cmd.Parameters.AddWithValue("userRole", ddl_role.SelectedValue);
             cmd.Parameters.AddWithValue("userPhoto", path);
             cmd.Parameters.AddWithValue("userStatus", ddl_status.SelectedValue);
             con.Open();
             int k = cmd.ExecuteNonQuery();
             if (k != 0)
             {
                 lblMsg.Text = "Record Inserted Succesfully into the Database";
                 lblMsg.ForeColor = System.Drawing.Color.CornflowerBlue;
             }
             con.Close();  
         }
    }


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

я хотел бы сохранить уникальное имя пользователя и пароль в таблице с помощью storeprocedture, пожалуйста, также сообщите update opration тоже. как я использую этот sp в своем коде.
Спасибо

CHill60

Вы уже используете sp в своем коде. Не храните пароли в базе данных.

UDTWS

Спасибо за ответ,
но этот код не работает из-за того, что не знаю, насколько точно я использую этот sp. got сообщение об ошибке вы не передаете результат.

CHill60

Вам нужно процитировать точное сообщение об ошибке

UDTWS

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

UDTWS

я сохраню свой пароль с помощью шифрования. а если не сохранить в базе данных, то что же мне делать?

CHill60

Ознакомиться с данной статьей, СР - Соленое хэширование паролей - делаем это правильно[^]

UDTWS

я изменяю в своем магазине процедуру, как показано ниже
изменить процедуру spCreateUser
@userName varchar(20),
@pass varchar(30),
@email varchar(50),
@userRole int,
@userPhoto varchar(100),
@userStatus int

АС
IF (SELECT COUNT(*) FROM tbl_user WHERE userName= @userName) < 1
НАЧАТЬ
Вставить в tbl_user(userName,pass,email,userRole,userPhoto,userStatus)
Значения(@имя,@пасс, электронная почта,@userRole,@userPhoto,@userStatus)
КОНЕЦ

это работает, но если не вставить значение из-за дубликата сообщения об ошибке how mange в любом методе C#

1 Ответов

Рейтинг:
1

CHill60

Ваша хранимая процедура пытается вернуть параметр @result но вы не создали его. Сделать это

. . .
cmd.Parameters.AddWithValue("userStatus", ddl_status.SelectedValue);

var result = cmd.Parameters.Add("@result", SqlDbType.Int);
    result.Direction = ParameterDirection.ReturnValue;

con.Open();
. . .
Чтобы правильно обрабатывать пароли смотрите эту статью CodeProject Соленое хэширование паролей - делаем это правильно[^]


UDTWS

охраняемых недействительными btn_insert_Click(объект отправителя, EventArgs в электронной)
{
строка CS = ConfigurationManager.Выберите["БСК"].Параметр connectionString;
string path = строка.Concat(Сервер.MapPath("~/UploadFile/" + fu_photo.имя файла));
фу_фото.SaveAs(путь);
using (SqlConnection con = new SqlConnection(CS))
{
SqlCommand cmd = new SqlCommand("spCreateUser", con);
УМК.CommandType = CommandType.Хранимая процедура;

cmd.параметры.AddWithValue("userName", txt_username.Текст);
cmd.параметры.AddWithValue("pass", txt_pass.Text);
cmd.параметры.AddWithValue("email", txt_email.Text);
cmd.параметры.AddWithValue("userRole", ddl_role.SelectedValue);
cmd.параметры.AddWithValue("userPhoto", path);
cmd.параметры.AddWithValue("userStatus", ddl_status.SelectedValue);
результат ВАР = ЦМД.Параметры.Добавить("@результате", значения sqldbtype.Инт);

returnParameter.Направление = ParameterDirection.Аргумент returnvalue;
против.Открыть();
int k = cmd.Метод executenonquery();
если (k != 0)
{
lblMsg.Text = "запись успешно вставлена в базу данных";
lblMsg.Свойство Forecolor = Система.Рисование.Цвет.Розовый;
}
против.Закрывать();
}

теперь ошибка есть :-
Имя 'returnParameter' не существует в текущем контексте.

CHill60

Извините - мой плохой, я переименовал свой пример, чтобы использовать ваши имена параметров, и пропустил его. Я обновил свое решение - это должно было читать

result.Direction = ParameterDirection.ReturnValue;

UDTWS

Спасибо за ответ, но все еще проблема не решена. Процедура или функция 'spCreateUser' ожидает параметр '@result', который не был указан. и я дал другой sp, чем дубликат пользователя, не введенного, но как сообщение показывает, что пользователь уже существует.

UDTWS

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

CHill60

Если вы пробовали другой метод, то вам нужно будет обновить свой вопрос с помощью нового кода или поднять новый вопрос