如何声明一个计数参数然后在 StringBuilder 中插入数据之前检查它

How to declare a count parameter then check it before inserting data in StringBuilder

使用 String Builder,我需要检查我应用程序中 3 个字段中的文本是否已经在我的数据库 table 中的 3 个对应列中,然后再插入其中任何一个。

首先,我将 3 个字段中的文本放入名为 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();

我将 String Builder 分配给了我的 reader.CommandText,然后执行了 reader.Execute();,正如我对所有数据库命中所做的那样。

Visual Studio 不喜欢我将 @count 变量放入我的 IF 语句中。每一个下面都有一条红色的波浪线。

那么在插入我的值之前,我如何使用 String Builder 检查我的计数变量是否小于 1?

谢谢!

嗯,您不能在 StringBuilder 中执行,但您可以更改命令以在 SQL 服务器中执行整个逻辑。

例如我会这样做(忽略哪一列是重复的):

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 方法执行此操作后,我将在 return 值中获得受影响的行数,并知道是否进行了任何插入。 (请注意,触发器可能会更改受影响的行数)

另一种方法是更改​​检查和选择结果值的命令(如 0:确定,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 的单个字符串就足够了..