2013-04-10 6 views
0

Я создаю запрос вставки в C# WinForms, до INSERT членов в таблицу базы данных (члены).
Я использую этот код:SQL IF ELSE Statement

IF NOT EXISTS(SELECT * FROM Members WHERE PersonalId = @PersonalId) 
BEGIN 
INSERT INTO Members (PersonalId, FirstName, LastName, City, PhoneNumber) 
VALUES (@PersonalId, @FirstName, @LastName, @City, @PhoneNumber) 
END 

(@PersonalId, должен иметь значение, которое пользователь вводит в textbox?)

Это всплывал:

enter image description here

Любая помощь?

+3

Можете ли вы добавить свой код C#? – Ash

+0

передать значение параметра для '@ PersonalId' – Arshad

ответ

0

Зачем вам это делать ?? Вместо этого просто определите столбец как Unique или, может быть, даже лучше, как Primary key (если в вашей таблице еще нет ПК).
После того, как вы это сделаете, ваш SQL-сервер позаботится об этом, потому что, если столбец отмечен как уникальный или PK, он не позволит другим элементам иметь одинаковое значение в столбце.

Там действительно нет необходимости ставить эту логику в каждом SQL вставки ...

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

+0

. Каким образом может быть выбрано какое-либо отличие от наличия предложения охраны в методе, а не исключения null исключений? –

+0

@CarlSixsmith, что вы подразумеваете под «как»? Если столбец должен иметь уникальное значение, он должен быть отмечен как таковой заранее. Ввод дополнительной логики внутри запросов является контрпродуктивным. Это не повлияет только на вставки, но также и на обновления. Ему придется проверять уникальность каждый раз, когда что-то меняется в таблице. Что, если какой-нибудь другой программист придет позже и не узнает, что ему нужно это проверить? Он смотрит на стол и не видит никаких ограничений. Зачем переместить эту логику из определения таблицы в отдельные запросы? Я не вижу ни одной причины, почему это можно сделать. – walther

+0

Потому что исключения catching крайне неэффективны в системах с большими объемами. Нет причин не делать то и другое. –

3

Это означает, что вам не хватает параметра. Вы должны иметь что-то вроде:

cmd.Parameters.AddWithValue("PersonalId", personalId); 

где (важно) personalIdне null (это может быть DBNull.Value, хотя).

(@PersonalId, должны иметь значение, которое пользователь вводит в текстовое поле?)

Это, вероятно, следует, но это звучит как вы не добавили его правильно.

+0

Или, возможно, это может быть один из 'gotcha', который я все время страдаю -' cmd.CommandType = CommandType.StoredProcedure; '. Не указывая, что обычно приводит к исключениям, связанным с параметрами, указанными в paremeter – LukeHennerley

+0

, параметр будет добавлен для 'CommandType' –

+0

. Он будет добавлен, но обычно приводит к исключению. Я всегда добавляю параметры как определенные, но если я не укажу тип команды, я получаю исключение. Это была только заметка из личного опыта, я все равно :) – LukeHennerley