2010-03-01 76 views
0

Inseting值使用SQL Server 2005中,vb.net如果不存在則表

表1

Name FromDate ToDate 

Raja 12/02/2010 14/02/2010 
Ravi 14/02/2010 15/02/2010 
Ramu 18/02/2010 21/02/2010 
..., 

Insert into Table1 values('" & textbox1.text & "', '" & textbox2.text & "'. '" & textbox3.text & "'", con) 

當我嘗試插入值表1它將如果它比較表中的值是相同的,它應該拋出一個錯誤消息「名稱和日期已經存在」否則插入一個值。

在插入之前我想檢查一個帶有表值的文本框值。

任何人都可以給出一個示例的想法或代碼。

+0

讓這兩列的組合鍵。 – 2010-03-01 12:52:32

回答

3

在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 
     } 
    } 
} 

很好地封裝每一個成一個單一的方法 - 這是否適合你?

+0

你的意思是10 – Gopal 2010-03-01 13:00:25

+0

@Marc_S,如果cmd = new Sqlcommand(「Your Query」,con),我無法做出來。在vb.net中,如果sqlcommand不接受。你對此有任何想法 。 – Gopal 2010-03-01 13:38:09

+0

如果另一個進程在你的IF EXISTS(SELECT ...和你的INSERT ???之間插入相同的行怎麼辦?你不需要在'SELECT'上添加一個事務和一個(UPDLOCK,HOLDLOCK)提示 – 2010-03-01 21:16:04

2

使用「IF不存在」命令

IF NOT EXISTS (SELECT * FROM Table WHERE YourContition) INSERT INTO Table (a,b) VALUES (@c1,@c2) 
相關問題