2013-04-26 3 views
0

Кто-нибудь знает, как вставлять данные в базу данных только один раз во время выполнения? потому что прямо сейчас, когда я запускаю свою систему, данные всегда будут вставлены в базу данных. его там какой-либо способ просто вставить данные только один раз, даже если я запустить программу много раз? Вот мои кодыПроверить, существовала ли запись

public async void getUserName() 
    { 
     LiveConnectClient client = new LiveConnectClient(session); 
     LiveOperationResult operationResultUserID = await client.GetAsync("me"); 
     dynamic resultUserID = operationResultUserID.Result; 

     userID = resultUserID.id; 
     //getUserInfo(); 

     Service1Client client1 = new Service1Client(); 
     name = await client1.RetrieveNameAsync(userID); 
     dob = await client1.RetrieveDOBAsync(userID); 
     aboutMe = await client1.RetrieveAboutMeAsync(userID); 
     country = await client1.RetrieveCountryAsync(userID); 
     email = await client1.RetrieveEmailAddressAsync(userID); 
     gender = await client1.RetrieveGenderAsync(userID); 
     //status = await client1.RetrieveUserStatusAsync(userID); 
     UserImage = await client1.RetrieveUserImgAsync(userID); 
     vote = await client1.retrieveVotesAsync(userID); 
     count = await client1.retrievecountLearningstoryAsync(userID); 


     txtAboutmeDisplay.Text = aboutMe; 
     txtCountryDisplay.Text = country; 
     txtDOBDisplay.Text = dob; 
     txtEmailDisplay.Text = email; 
     txtGenderDisplay.Text = gender; 
     txtName.Text = name; 
     txtvotes.Text = vote; 
     txtCountDisplay.Text = count.ToString(); 

     int numberofvotes = int.Parse(txtvotes.Text); 
     if (numberofvotes >=1000) 
     { 
      txtstars.Text = "Gold"; 
     } 
     else if (numberofvotes >= 700) 
     { 
      txtstars.Text = "Silver"; 
     } 
     else if (numberofvotes >= 500) 
     { 
      txtstars.Text = "Bronze"; 
     } 



      //txtstars.Visibility == false; 
     InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream(); 
     DataWriter writer = new DataWriter(randomAccessStream.GetOutputStreamAt(0)); 
     writer.WriteBytes(UserImage); 
     await writer.StoreAsync(); 
     // Create bitmap image 
     BitmapImage b = new BitmapImage(); 
     b.SetSource(randomAccessStream); 
     // Update Image on XAML Page 

     imgProfilePic.Source = b; 

     int countstory = int.Parse(txtCountDisplay.Text); 
     if (countstory >= 7) 
     { 
      achievement = await client1.updateachievementAsync(userID, "wisemen"); 
     } 

     else if (countstory == 6) 
     { 
      achievement = await client1.updateachievementAsync(userID, "Smartboy"); 
     } 
     else if (countstory == 5) 
     { 
      achievement = await client1.insertAchievementAsync(userID, "novice"); 
     } 

    } 

Моих WebService кодов

public string insertAchievement(string userid, string achievements) 
    { 
     SqlConnection con = new SqlConnection(connectionString); 

     con.Open(); 
     string insertInterBadges = "Insert into [Achievement] (UserID, Achievement) VALUES " + " (@userid,@achievements)"; 
     SqlCommand cmd = new SqlCommand(insertInterBadges, con); 
     cmd.Parameters.AddWithValue("@userId", userid); 
     cmd.Parameters.AddWithValue("@achievements", achievements); 

     int check = cmd.ExecuteNonQuery(); 
     con.Close(); 
     if (check > 0) 
     { 
      return "Success"; 
     } 
     else 
     { 
      return "Fail"; 
     } 
    } 


    public string updateachievements(string userid, string achievements) 
    { 
     SqlConnection con = new SqlConnection(connectionString); 

     con.Open(); 
     string updateAchievements = "UPDATE Achievement SET [email protected] Where [email protected]"; 
     SqlCommand cmd = new SqlCommand(updateAchievements, con); 
     cmd.Parameters.AddWithValue("@userId", userid); 
     cmd.Parameters.AddWithValue("@achievement", achievements); 

     int check = cmd.ExecuteNonQuery(); 
     con.Close(); 
     if (check > 0) 
     { 
      return "Success"; 
     } 
     else 
     { 
      return "Fail"; 
     } 

    } 

моего Reference.cs

[System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IService1/updateachievement", ReplyAction = "http://tempuri.org/IService1/updateachievement")] 
    System.Threading.Tasks.Task<string> updateachievementAsync(string userId, string achievements); 

    [System.ServiceModel.OperationContractAttribute(Action = "http://tempuri.org/IService1/insertAchievement", ReplyAction = "http://tempuri.org/IService1/insertAchievement")] 
    System.Threading.Tasks.Task<string> insertAchievementAsync(string userId, string achievements); 

public System.Threading.Tasks.Task<string> updateachievementAsync(string userId, string achievements) 
    { 
     return base.Channel.insertAchievementAsync(userId, achievements); 
    } 

    public System.Threading.Tasks.Task <string> insertAchievementAsync(string userId, string achievements) 
    { 
     return base.Channel.insertAchievementAsync(userId, achievements); 
    } 

я использую веб-сервис по пути

+0

Очевидным ответом является проверка того, находятся ли данные уже в базе данных, прежде чем вставлять их снова. –

ответ

1

взглядов кода, а именно UPDATE, одному пользователю может быть назначено только одно достижение. Это ограничение делает простой способ создания уникального индекса на UserId, AcheivementId не жизнеспособным вариантом (этот индекс, если он создан, предотвратит дублирование записей через ошибку вставки SQL).

В качестве альтернативы, более правильным, решением является запрос таблицы до вставки, чтобы увидеть, если уже существуют значения:

SELECT COUNT(*) FROM Achievement WHERE UserId = @userId AND Achievement = @achievement 

Это может быть использовано в блоке, как:

using (SqlConnection conn = new SqlConnection(connectionString)) { 
    conn.Open(); 
    bool isNewValue = true; 
    using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Achievement WHERE UserId = @userId AND Achievement = @achievement")) { 
     cmd.Parameters.AddWithValue("@userId", userid); 
     cmd.Parameters.AddWithValue("@achievement", achievements); 
     isNewValue = ((int)cmd.ExecuteScalar() == 0); 
    } 

    if (isNewValue) { 
     // insert user achievement/etc 
    } 
} 
+0

Спасибо, что его работы прекрасны! :) –

Смежные вопросы