【问题标题】:IF Not Exist then Inseting a value in the table如果不存在则在表中插入一个值
【发布时间】:2010-03-01 12:50:05
【问题描述】:

使用 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)

当我尝试在 table1 中插入一个值时,它会比较表中的值是否相同,它应该抛出错误消息“名称和日期已经存在”,否则插入一个值。

在插入之前,我想检查一个带有表格值的文本框值。

任何人都可以为此提供示例想法或代码。

【问题讨论】:

  • 将这两列设为复合键。

标签: c# sql-server vb.net


【解决方案1】:

在 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 文档中查看所有可用严重性和状态的列表。

或者将整个语句包装到处理所有这些的存储过程中,然后调用该存储过程。


更新:

创建存储过程:

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

这很好地将所有内容封装到一个方法中 - 这对您有用吗??

【讨论】:

  • @Marc_S,如果 cmd =new Sqlcommand("Your Query", con),我无法创建。如果 sqlcommand 不接受,则在 vb.net 中。你对此有什么想法吗?
  • 如果另一个进程在您的 IF EXISTS (SELECT... 和您的 INSERT 之间插入同一行?您不需要添加事务和 (UPDLOCK, HOLDLOCK) 提示SELECT
  • @KM:是的,最终,这将是最好的解决方案 - 将所有内容包装在事务中。我只是想让 OP 开始甚至插入任何数据......但你是绝对正确的
  • @Marc_s - 当我尝试插入相同的记录时,您的代码不允许插入,但是当我关闭表单,然后再次加载表单时,您的代码允许插入相同的记录。
  • @Gopal:这里肯定还有其他问题——这个对数据库的检查会起作用——不管你是否“关闭你的表单”。要么你的数据没有写入数据库,要么你正在做其他事情来解决这个问题......
【解决方案2】:

使用“如果不存在”命令

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

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2016-11-27
    • 1970-01-01
    • 2018-09-17
    • 2015-06-09
    • 2012-06-07
    相关资源
    最近更新 更多