C # .Net3.5 добавление данных в базу данных SQL Server 2005, если она еще не существует и обновляет ли она? - PullRequest
1 голос
/ 12 ноября 2010

Привет, теперь я впервые играю с 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();
}

Ответы [ 4 ]

2 голосов
/ 12 ноября 2010

Вы женаты на SQL 2005?Если нет, я бы посоветовал взглянуть на SQL 2008, так как он решает эту проблему с помощью команды MERGE.Если вы находитесь в ситуации, когда вы не можете использовать SQL 2008, тогда достаточно просто обернуть эти команды в немного больше кода SQL.

IF EXISTS (<Preform your Check>)
BEGIN
    Update ... blah blah
END
ELSE
BEGIN
    INSERT ()...
END
1 голос
/ 12 ноября 2010
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;
}
1 голос
/ 12 ноября 2010

вместо написания вашего sql-запроса в вашем коде, вы можете создать для этого процедуру и написать ее. и в процедуре, используя if else, вы можете проверить, есть ли запись или нет, если вы пишете свой запрос на обновление со своими параметрами, иначе вы пишете свой запрос вставки.

0 голосов
/ 12 ноября 2010

Сначала выполните такой запрос:

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

Если RecordCount равно 0, сделайте вставку, если не обновите.

...