2015-04-07 8 views
1

Я ищу (PostId, UserId) в таблице PostLikes с помощью SqlDataAdapter, если строка найдена, я использую SqlCommandBuilder.GetDeleteCommand() для создания инструкции удаления и удаления базовой строки, если строка не найден, используя SqlCommandBuilder.GetInsertCommand() для генерации команды вставки и вставки строки в таблицу с помощью SqlDataAdapter.Update(). Но строка не будет вставлена ​​в таблицу в database.Here является то, что я сделал до сих пор
SqlDataAdapter.update() не обновляет базу данных

SqlConnection con = new SqlConnection(connectionStrings); 
       SqlDataAdapter sqlDataAdapter=new SqlDataAdapter("select * from PostLikes where PostId like "+postlike.PostId+" and UserId like "+postlike.UserId,con); 
       DataSet ds = new DataSet(); 
       sqlDataAdapter.Fill(ds, "Result"); 
       con.Open(); 
       SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter); 
       if(ds.Tables["Result"].Rows.Count==1) 
       { 
        sqlDataAdapter.DeleteCommand = sqlCommandBuilder.GetDeleteCommand(true); 
        msg = "Data is deleted"; 
       } 
       else 
       { 
        sqlDataAdapter.InsertCommand = sqlCommandBuilder.GetInsertCommand(true); 
        msg = "Data is inserted"; 
       } 
       sqlDataAdapter.Update(ds, "Result"); 

и стол
PostLikes (LikeId, сообщения дан, UserId)

ответ

1

Есть несколько вопросы:

  • Вы хотите повторно использовать ту же команду, и обнаружить, существует ли строка, и поставлять на SqlAdapter для SqlCommandBuilder.
  • Вы должны параметризовать исходный запрос выбора для защиты от атак SqlInjection (а также незначительное преимущество в производительности). CommandBuilder автоматически параметризовать Insert/Delete команды
  • После создания Insert/Delete команды с SqlCommandBuilder, то вам необходимо изменить базовый набор данных для того, чтобы любые изменения, которые будут внесены в таблицу во время Update.
  • Обратите внимание, что многие из объектов Sql являются IDisposable и должны быть удалены как можно скорее - using.

.

var postId = 1; 
var userId = 1; 
string msg; 
using (var con = new SqlConnection(@"data source=...")) 
using (var selectCommand = new SqlCommand(
"select LikeId, PostId, UserId from PostLikes WHERE [email protected] AND [email protected]", con)) 
using (var sqlDataAdapter = new SqlDataAdapter(selectCommand)) 
using (var ds = new DataSet()) 
{ 
    con.Open(); 
    selectCommand.Parameters.AddWithValue("@PostId", postId); 
    selectCommand.Parameters.AddWithValue("@UserId", userId); 
    sqlDataAdapter.Fill(ds, "Result"); 
    using (var sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter)) 
    { 
     if (ds.Tables["Result"].Rows.Count == 1) 
     { 
      sqlDataAdapter.DeleteCommand = sqlCommandBuilder.GetDeleteCommand(true); 
      ds.Tables["Result"].Rows[0].Delete(); 
      msg = "Data will be deleted"; 
     } 
     else 
     { 
      sqlDataAdapter.InsertCommand = sqlCommandBuilder.GetInsertCommand(true); 
      // Null because LikeId is Identity and will be auto inserted 
      ds.Tables["Result"].Rows.Add(null, postId, userId); 
      msg = "Data will be inserted"; 
     } 
     sqlDataAdapter.Update(ds, "Result"); 
    } 
} 

я предполагал следующую схему:

CREATE TABLE PostLikes 
(
    LikeId INT IDENTITY(1,1) PRIMARY KEY, 
    PostId INT, 
    UserId INT 
) 

И я предположил, что вы хотите «тумблер» вставка или удаление строки с postId, userid комбинации.

+0

is con.Open() необходим с SqlDataAdapter? – Vivek

+0

Хорошая точка - нет, она может [обнаруживать закрытое соединение и открывать его автоматически] (https://msdn.microsoft.com/en-us/library/377a8x4t.aspx). Но, очевидно, вам нужно будет вручную открыть соединение, если вы также используете только базовый/прямой 'SqlCommand' – StuartLC

+0

, да, я думал то же самое. Большое спасибо. – Vivek

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