Если вы используете MS SQL-сервер, я бы использовал хранимую процедуру в базе данных для вставки новых записей и CLR (скалярную функцию) для получения следующего номера счета. На этом пути вы можете убедиться, что номер является уникальным.
ИП может выглядеть так:
CREATE PROCEDURE [dbo].[InsertBill]
@idBill int OUTPUT,
@CreationDate datetime OUTPUT,
@Name varchar(50) OUTPUT,
@BillNumber char(10) OUTPUT
with execute as Owner
AS
INSERT INTO tBill(CreationDate, Name, BillNumber)
VALUES (GetDate(), @Name, dbo.GetNextBillNumber())
;SELECT @idBill=idBill,@CreationDate=CreationDate, @Name=Name, @BillNumber=BillNumber
FROM tBill WHERE (@idBill = SCOPE_IDENTITY())
Следующее число будет MAX(BillNumber)+1
, формат 10 символов (A + 9 цифр), CLR для генерации следующего номера счета:
CREATE FUNCTION [dbo].[GetNextBillNumber]()
RETURNS CHAR(10)
AS
BEGIN
DECLARE @BillNumber CHAR(10);
DECLARE @nextBillNumber int;
SET @nextBillNumber = CONVERT(int,SUBSTRING((SELECT MAX(BillNumber) FROM tBill),2,9)) + 1;
SET @BillNumber = 'A' + RIGHT('000000000'+ CONVERT(VARCHAR,@nextBillNumber),9)
return @BillNumber
END
Примечание: не проверено на 100%, но вы должны понимать, что я имею в виду.
Редактировать: Вы также должны добавить уникальное ограничение , чтобы гарантировать уникальность. Тогда технически невозможно вставить две записи с одним и тем же номером счета. В этом примере я предположил, что первичный ключ таблицы не сам номер счета, а int-столбец, который является идентификатором (автоинкремент, здесь SSMS ).
Здесь - информация о том, как вызвать хранимую процедуру из ADO.NET.