В T-SQL:
IF EXISTS(SELECT * FROM dbo.Table1 WHERE Name = @Name AND FromDate = @FromDate AND ToDate = @ToDate)
RAISERROR (N'Values already exist', 10, 1)
ELSE
INSERT INTO dbo.Table1(Name, FromDate, ToDate)
VALUES(@Name, @FromDate, @ToDate)
А затем вызовите это из параметризованного запроса в вашем коде VB.NET.
Подробнее о RAISERROR см. В документах MSDN: http://msdn.microsoft.com/en-us/library/ms178592.aspx. Значение «10» здесь обозначает серьезность, «1» - состояние. Вы можете просмотреть список всех доступных уровней серьезности и состояний в документах MSDN.
Или оберните весь оператор в сохраненный процесс, который имеет дело со всем этим, и просто вызовите этот сохраненный процесс.
UPDATE:
Создать сохраненный процесс:
CREATE PROCEDURE dbo.InsertData(@Name VARCHAR(50), @FromDate DATETIME, @ToDate DAETIME)
AS BEGIN
BEGIN TRANSACTION
IF EXISTS(SELECT * FROM dbo.Table1 WHERE Name = @Name AND FromDate = @FromDate AND ToDate = @ToDate)
ROLLBACK TRANSACTION
RAISERROR (N'Values already exist', 10, 1)
ELSE
INSERT INTO dbo.Table1(Name, FromDate, ToDate)
VALUES(@Name, @FromDate, @ToDate)
COMMIT TRANSACTION
END
и затем вызовите это из своего кода (я не бегло говорю на VB.NET - это C #, но должен быть достаточно простым для перевода):
using(SqlConnection _con = new SqlConnection('your connection string here'))
{
using(SqlCommand _cmd = new SqlCommand("InsertData", _con)
{
_cmd.CommandType = CommandType.StoredProcedure;
// add parameters as necessary
_cmd.Parameters.AddWithValue("@Name", "Your Name");
_cmd.Parameters.AddWithValue("@FromDate", "20100101");
_cmd.Parameters.AddWithValue("@ToDate", "20100331");
try
{
// open connection, execute stored proc, close connection
_con.Open();
_cmd.ExecuteNonQuery();
_con.Close();
}
catch(SqlException sqlexc)
{
// handle SQL exception
}
}
}
Это красиво объединяет все в один метод - это работает для вас ??