在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
}
}
}
很好地封裝每一個成一個單一的方法 - 這是否適合你?
讓這兩列的組合鍵。 – 2010-03-01 12:52:32