SqlDataAdapter.update() 不更新数据库

     2023-05-08     188

关键词:

【中文标题】SqlDataAdapter.update() 不更新数据库【英文标题】:SqlDataAdapter.update() not updating database 【发布时间】:2015-04-07 04:22:47 【问题描述】:

我正在使用SqlDataAdapter 在 PostLikes 表中搜索 (PostId,UserId),如果找到该行,我正在使用SqlCommandBuilder.GetDeleteCommand() 生成删除指令并删除底层行,如果未找到该行,然后我使用SqlCommandBuilder.GetInsertCommand() 生成插入命令并使用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)

【问题讨论】:

【参考方案1】:

有几个问题:

您希望重复使用相同的命令来检测该行是否存在,并为SqlCommandBuilder 提供给SqlAdapter。 您应该对初始选择查询进行参数化,以防止 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 组合“切换”插入或删除行。

【讨论】:

是否 con.Open() 对 SqlDataAdapter 是必需的? 好点 - 不,它可以detect the closed connection and open it automatically。但显然,如果您还只使用基本/直接SqlCommand,则需要手动打开连接

当 RowState = Modified 时 SQLDataAdapter.Update() 不更新

】当RowState=Modified时SQLDataAdapter.Update()不更新【英文标题】:SQLDataAdapter.Update()notUpdatingwhenRowState=Modified【发布时间】:2018-05-1516:41:39【问题描述】:我正在尝试设置一个程序,当用户更新项目描述时,将在保存表单时更新数据库... 查看详情

SqlDataAdapter.Update(dataset) 方法插入新行但不更新现有行

】SqlDataAdapter.Update(dataset)方法插入新行但不更新现有行【英文标题】:SqlDataAdapter.Update(dataset)methodinsertsnewrowsbutdoesnotupdatesexistingrows【发布时间】:2014-06-0114:56:49【问题描述】:我正在创建具有DataGrigView来呈现表格的winform应用程... 查看详情

使用带参数的 SqlDataAdapter.Update()

】使用带参数的SqlDataAdapter.Update()【英文标题】:UsingSqlDataAdapter.Update()withParameters【发布时间】:2011-08-2614:20:32【问题描述】:如何尝试通过参数化查询找出如何使用SqlDataAdapter.Update(DataTable)方法。如何在不遍历整个DataTable的情... 查看详情

C# SqlDataAdapter.Update()

】C#SqlDataAdapter.Update()【英文标题】:【发布时间】:2010-07-1208:39:42【问题描述】:我要疯了。我做了ff:创建数据表。通过SqlDataAdapter从SQL数据库填充它。通过datagridview编辑数据表。调用sqldataadapter.update但更改不会持久化到数据... 查看详情

SqlDataAdapter.Update 未更新

】SqlDataAdapter.Update未更新【英文标题】:SqlDataAdapter.Updatenotupdating【发布时间】:2015-10-2119:34:29【问题描述】:(我应该说我对vb.net相当陌生)我在覆盖我的数据库中的条目时遇到问题。我认为问题在于SqlDataAdapter.Update没有用我... 查看详情

在 SqlDataAdapter.Update() 中获取错误消息

】在SqlDataAdapter.Update()中获取错误消息【英文标题】:GettingerrormessageinSqlDataAdapter.Update()【发布时间】:2016-07-1419:43:38【问题描述】:我有一个数据库表(在本例中为空)createtablewords(idintnotnull,wordnvarchar(50)notnull)还有一个DataGridVie... 查看详情

200万条记录的SqlDataAdapter.Update()速度极慢

】200万条记录的SqlDataAdapter.Update()速度极慢【英文标题】:SqlDataAdapter.Update()of2millionrecordsisextremelyslow【发布时间】:2019-04-3009:22:51【问题描述】:我有一个客户希望每天将他的子客户价格工具(超过2.000.000条记录)导入SQLServer数... 查看详情

使用 SqlDataAdapter.Update 方法时复制表行

】使用SqlDataAdapter.Update方法时复制表行【英文标题】:DuplicatingtablerowswhenusingSqlDataAdapter.UpdateMethod【发布时间】:2013-11-0403:08:40【问题描述】:在我的项目中,我有表格“产品”。IDNamePrice------------------1xyz1002abc2003pqr300在我的c#代... 查看详情

SqlDataAdapter.Update 直到第二次更新才写入表

】SqlDataAdapter.Update直到第二次更新才写入表【英文标题】:SqlDataAdapter.Updatenotwritingtotableuntilsecondupdate【发布时间】:2014-08-0201:15:03【问题描述】:我有一个用C#2010Express开发的程序,它的表单由一个DataGridView组成,下面有一个单... 查看详情

如果我将列值“更改”为已经存在的值,会调用 UPDATE 吗?

...需要额外的逻辑来避免对我的SQL数据库的无用调用,或者SqlDataAdapter.Update()是否会做正确的事情。如果我有这个代码:SqlCon 查看详情

酒店管理系统无法向数据库插入新的记录,提示列“入住日期”不允许为nulls,急求!!

...,"客人信息表").EndCurrentEdit()'将数据返回数据集SqlDataAdapter2.Update(Ds1,"客人信息表")'更新数据,返回数据源Ds1.Tables("客人信息表").Clear()'以下代码把选择了的房间的"状态"字段更新为"营业中&... 查看详情

Mono C# SQL 更新“并发冲突”

...:2009-07-1015:24:22【问题描述】:每次我尝试通过Mono中的SqlDataAdapter.Update()更新一行时,我都会得到:未处理的异常:System.Data.DBConcurrencyException:并发冲突:UpdateCommand影响了0条记录。 查看详情

datatable数据批量写入数据库三种方法比较

DataTable数据批量写入数据库三种方法比较标签:it 分类:C#1)  insert循环插入;2)  sqldataadapter.update(dataset,tablename);3)  sqlbulkcopy.WriteToServer(datatable);1、生成测试的datatable表,表结构如下:UniqueID(主 查看详情

c#怎样才能实现客户端通过服务器端连接数据库服务器???

...行解压缩、和反序列化为DataTable7.再将DataTable通过DataSet和SqlDataAdapter.Update(Table)存在SQL中下面我只给一些关键的代码,我有实现过的第一步.客户端==》连接服务器并通讯,主要是发送SQL给服务器返回一个DataTable表usingSystem;usingSystem... 查看详情

不能对不可变值使用变异成员:函数调用返回不可变值 - 不确定为啥值是不可变的

】不能对不可变值使用变异成员:函数调用返回不可变值-不确定为啥值是不可变的【英文标题】:Cannotusemutatingmemberonimmutablevalue:functioncallreturnsimmutablevalue-notsurewhyvalueisimmutable不能对不可变值使用变异成员:函数调用返回不可变... 查看详情

不存在不存在

】不存在不存在【英文标题】:Notintonotexists【发布时间】:2019-05-0815:21:15【问题描述】:我有一个“不存在”,我试图在我的选择的where子句中变成一个“不存在”我尝试切换最低限度但没有填充任何内容(它确实执行了where[a]n... 查看详情

查询不使用不存在

】查询不使用不存在【英文标题】:Querynotusingnotexist【发布时间】:2014-01-0916:42:48【问题描述】:如何用不存在的方式重写下面的查询,性能比不存在的更好SELECTm.memberFROMmembermWHERE1=1ANDNOTEXISTS(SELECTNULLFROMhistoryc,tendertWHERE1=1ANDc.card... 查看详情

《罗辑思维:成大事者不纠结》简评:未来不迎,当下不杂,过往不恋

破解纠结最好的法门,就是专注于当下。未来不迎、当时不杂、过往不恋。把所有注意力放在当下,不管过去、不管未来、不管周边,做当下最该做的事。现代的人有很多的往年,想要进大组织,你就可能就犯了左中堂的错误。... 查看详情