【问题标题】:C# .Net3.5 adding data to a SQL Server 2005 database if it dosn't already exist and if it does update it?C# .Net3.5 将数据添加到 SQL Server 2005 数据库(如果它尚不存在并且更新它)?
【发布时间】:2010-11-11 22:26:47
【问题描述】:

您好,现在是第一次使用 SQL!

我有下面的代码,它工作正常,但我需要检查条目是否已经在使用 CustomerName 和 Product 匹配的数据库中,如果它在数据库中,请更新其他字段,如果没有插入所有数据。

我该怎么做?

下面是我用来插入新记录的代码:

DateTime FirstDateSeen = new DateTime();
FirstDateSeen = DateTime.Now.Date;

DateTime LastDateSeen = new DateTime();
LastDateSeen = DateTime.Now.Date;

SqlConnectionStringBuilder MySqlConnection = new SqlConnectionStringBuilder("MY CONNECTION");
SqlConnection db = new SqlConnection(MySqlConnection.ToString());

try //sql string for first seen
{
   string sqlIns = "INSERT INTO Customer (Product, Version, CustomerName, CustomerPostcode,  FirstSeen, LastSeen)" +
   "VALUES (@Product, @Version, @CustomerName, @CustomerPostcode, @FirstSeen, @LastSeen)";

   db.Open();
   SqlCommand cmdIns = new SqlCommand(sqlIns, db);
   cmdIns.Parameters.Add("@CustomerName", UniqueA);
   cmdIns.Parameters.Add("@Product", AppName);
   cmdIns.Parameters.Add("@Version", AppVer);
   cmdIns.Parameters.Add("@CustomerPostcode", UniqueB);
   cmdIns.Parameters.Add("@FirstSeen", FirstDateSeen.ToShortDateString());
   cmdIns.Parameters.Add("@LastSeen", LastDateSeen.ToShortDateString());
   cmdIns.ExecuteNonQuery();

   cmdIns.Parameters.Clear();
   cmdIns.Dispose();
   cmdIns = null;
}
catch (Exception ex)
{
   throw new Exception(ex.ToString(), ex);
}
finally
{
   db.Close();
}

【问题讨论】:

    标签: c# sql sql-server-2005 .net-3.5


    【解决方案1】:

    您是否已与 SQL 2005 结婚?如果不是,我建议查看 SQL 2008,因为它使用 MERGE 命令解决了这个问题。 如果您处于无法使用 SQL 2008 的情况,那么只需将这些命令包装在更多 SQL 代码中即可。

    IF EXISTS (<Preform your Check>)
    BEGIN
        Update ... blah blah
    END
    ELSE
    BEGIN
        INSERT ()...
    END
    

    【讨论】:

      【解决方案2】:
      IF EXISTS(SELECT CustomerName FROM Customer WHERE CustomerName = @CustomerName)
      BEGIN
         UPDATE Customer ..
      END
      ELSE
      BEGIN 
          INSERT INTO Customer (Product, Version, CustomerName, CustomerPostcode,  FirstSeen, LastSeen)  
          VALUES (@Product, @Version, @CustomerName, @CustomerPostcode, @FirstSeen, @LastSeen)
      END
      

      这里还有很多其他有趣的事情......

      这是一个指针

      catch (Exception ex)
      {
         throw new Exception(ex.ToString(), ex);
      }
      

      不如

      catch (Exception ex)
      {
         // do stuff
         throw;
      }
      

      catch ()
      {
         throw;
      }
      

      【讨论】:

      • exist etc 是否都是 SQL 命令的一部分? (不是c#!!)
      • @Adrian 是的,人们给出的答案都是 SQL(除了@Hogan 关于异常捕获器的切线)。
      【解决方案3】:

      您可以为此创建一个过程并编写它,而不是在您的代码上编写您的 sql 查询。在使用 if else 的过程中,您可以检查是否有条目,如果有,则使用参数编写更新查询,否则编写插入查询。

      【讨论】:

        【解决方案4】:

        首先执行这样的查询:

        SELECT COUNT(*) AS RecordCount FROM Customer 
            WHERE Product=@Product AND CustomerName=@CustomerName
        

        如果RecordCount 为0,则进行插入,否则进行更新。

        【讨论】:

        • 是的,使用 EXISTS。它会在找到满足条件的第一个记录时短路。
        猜你喜欢
        • 1970-01-01
        • 2016-07-28
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多