2010-03-01 37 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)