当前位置: 首页 > 面试题库 >

SqlDataAdapter.update()不更新数据库

吕华彩
2023-03-14
问题内容

我正在使用()查找PostLikes表中的(PostId,UserId)SqlDataAdapter,如果找到该行,则SqlCommandBuilder.GetDeleteCommand()用于生成delete指令并删除基础行,如果未找到该行,则SqlCommandBuilder.GetInsertCommand()用于生成insert命令并使用将该行插入表中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,PostId,UserId)


问题答案:

有几个问题:

  • 您正在寻找重复使用相同的命令,这两个检测行是否存在,并提供给SqlAdapterSqlCommandBuilder
  • 您应该对初始选择查询进行参数设置,以防止SqlInjection攻击(并且性能会有次要的好处)。CommandBuilder将自动参数化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 PostId=@PostId AND UserId=@UserId", 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



 类似资料:
  • 出于某种原因,当这个JTable被调用时,它没有任何变化(这个方法在用户提交SQL查询后更新JTable)。 给定:验证数据向量和列名称向量是否正确填充。JTable 是一个私有类变量。 有什么想法吗?

  • 问题内容: 我对/ 有问题。我的数据表未刷新/更新。我正在使用,根据代码,一切都很好,并且没有任何错误。我也有一个带有分页的表,这就是为什么我使用动作监听器和按钮“上一个”和“下一个”的原因。我正在从其他函数传递到在is中的类中编码的函数 。问题是我填充了包含表数据的数组,但是表不会更新/刷新它。这是我的代码。谢谢前进。 大编辑 旧代码已删除。我添加了新代码,可以帮助您了解我的问题。希望这会有所帮

  • 我有一个Spring应用程序,其中Domain Object标识符不是由数据库分配的,而是由应用程序生成的。标识符是在BeforeSave回调期间生成并添加到Domain Object中的。保存域对象(插入)后,当尝试保存具有相同标识符的域对象(更新)时,我收到以下错误 原因:组织。springframework。道。Incorrectupdatesemanticdataaccessexcepti

  • 我目前正在重构遗留代码,以使用Android架构组件,并在一种存储库模式中设置一个房间数据库和截取请求。因此,表示层/域层要求存储库获取LiveData对象进行观察,或告诉他与服务器同步,然后删除旧的db条目,并从服务器中重新提取所有当前条目。 我已经写了同步部分的测试,所以我确信,对象被正确地获取并插入到数据库中。但是当写一个测试来观察db表的条目时(并测试对象是否被正确保存,以及在将它们放入d

  • 我想知道ehcache是否有办法检测数据库更新/插入(spring/java,hibernate web应用程序),并使用数据库中的当前(最新)数据刷新其缓存。如果没有,检测数据库更新的最佳方法是什么,以保持与缓存和数据库之间的数据同步?

  • RecycerView只显示创建时ArrayList(适配器的数据)中的项。我所有添加更多行的尝试似乎都奏效了,但列表仍然是初始数据。它不是重复的,因为我尝试了谷歌上找到的所有建议。我已经做了什么: Adapter.NotifyDataSetChanged(); Adapter.NotifyItemChanged(5); recyleList.invalidate(); recyclelist.s