2015-12-21 1 views
-2

Используя String Builder, мне нужно проверить, находится ли текст в трех полях в моем приложении уже в 3 соответствующих столбцах в моей таблице базы данных, прежде чем вставлять какие-либо из них.Как объявить параметр count, а затем проверить его перед вставкой данных в StringBuilder

Сначала я поместил текст из трех полей в свойства объекта, называемые LastName, StreetAddress и ZipCode. Затем я создал свои параметры. курица я сделал это:

var sb = new StringBuilder(); 

sb.Append("DECLARE @countLastName INT;"); 

sb.Append("DECLARE @countStreetAddress INT;"); 

sb.Append("DECLARE @countZipCode INT;"); 

sb.Append("SELECT @countLastName = COUNT (*) FROM tblCustomer WHERE LastName = @LastName;"); 

sb.Append("SELECT @countStreetAddress = COUNT (*) FROM tblCustomer WHERE StreetAddress = @StreetAddress;"); 

sb.Append("SELECT @countZipCode = COUNT (*) FROM tblCustomer WHERE ZipCode = @ZipCode;"); 

if (@countLastName < 1 || @countStreetAddress < 1 || @countZipCode < 1) 
{     
    sb.Append("INSERT INTO tblCustomer ("); 

    sb.Append("LastName, "); 

    sb.Append("StreetAddress, "); 

    sb.Append("ZipCode) "); 

    sb.Append("VALUES (@LastName, @StreetAddress, @ZipCode) "); 
} 
else 
{ 
    [Code that results in 1 of 3 messages being displayed to user based on which field is already in database. IE "LastName already exists"] 
} 

reader.CommandText = sb + ""; 
} 

reader.Execute(); 

Я назначил струнный Builder моему reader.CommandText, затем сделал reader.Execute() ;, как я сделал для всех моих хитов базы данных.

Visual Studio не нравится, что я помещаю переменные @count в свой оператор IF. У каждого из них есть красные криволинейные линии.

Как я могу проверить с помощью String Builder, что мои переменные счетчика меньше 1, прежде чем вставлять мои значения?

Спасибо!

+4

Строка Builder не извлекает данные из базы данных, так что нет никакого способа для Вас, чтобы сделать это таким образом. Все, что вы здесь делаете, это создать строку с этими операторами sql. Мне кажется, что вы не изучили, как выбирать данные из базы данных на C#. Вы должны это сделать, а затем вернуться, когда у вас есть лучшее представление о том, что вы пытаетесь сделать. –

+2

См. [Этот вопрос и ответ] (http://stackoverflow.com/questions/14171794/retrieve-data-from-a -sql-server-database-in-c-sharp), чтобы получить представление о том, как получить данные с сервера sql в C# –

+0

Мои извинения. Я не сказал, что тогда я ввел свою строку в reader.CommandText, а затем сделал reader.Execute(), так же, как и для всех моих методов доступа к базе данных, которые отлично работают. Я действительно думал, что это просто вопрос о том, как объявить параметр в StringBuilder, а затем проверить его перед вставкой, если я могу это сделать вообще. Это вам поможет? – user2980343

ответ

0

Ну, вы не можете выполнить внутри StringBuilder, но вы можете изменить свою команду, чтобы выполнить целую логику в SQL Server.

Например, я хотел бы сделать это таким образом (игнорируя какой столбец является дубликатом):

IF(select COUNT (*) FROM tblCustomer WHERE LastName = @LastName or StreetAddress = @StreetAddress or ZipCode = @ZipCode) = 0 BEGIN 
    INSERT INTO tblCustomer (LastName, StreetAddress, ZipCode) VALUES (@LastName, @StreetAddress, @ZipCode) 
END 

После того как я выполнить это с помощью метода ExecuteNonQuery, я получить пораженное количество строк в возвращаемом значении и знать, если какие-либо вставки сделаны. (Обратите внимание, что триггеры могут изменять количество строк в строке)

Другой способ - изменить команду, которая проверяет и выбирает значение результата (например, 0: ok, 1: фамилия уже существует, 2: адрес уже существует и т. Д.). Чтобы вы могли использовать ExecuteScalar или ExecuteReader и получить выбранное значение в качестве результата.

IF(select COUNT (*) FROM tblCustomer WHERE LastName = @LastName) > 0 BEGIN 
    SELECT 1 
END ELSE IF(select COUNT (*) FROM tblCustomer WHERE StreetAddress = @StreetAddress) > 0 BEGIN 
    SELECT 2 
END ELSE IF(select COUNT (*) FROM tblCustomer WHERE ZipCode = @ZipCode) > 0 BEGIN 
    SELECT 3 
END ELSE BEGIN 
    INSERT INTO tblCustomer (LastName, StreetAddress, ZipCode) VALUES (@LastName, @StreetAddress, @ZipCode) 
    SELECT 0 
END 

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

Ни методы использует StringBuilder, одна строка, назначенная для command.CommandText достаточно я думаю ..

+0

Благодарим вас за помощь @Ramazan. Я попробовал ваше второе предложение, но у меня возникли проблемы, потому что приложение не понравилось выборам («Выбрать 1», «Выбрать 2» ...), я думаю, потому что он подключен к внешнему коду, который нужно будет изменить. Вместо этого я просто упростил и использовал ваше первое предложение. Отлично! – user2980343