SqlDataAdapter.update() 未更新数据库
SqlDataAdapter.update() not updating database
我正在使用 SqlDataAdapter
在 PostLikes table 中搜索 (PostId,UserId),如果找到该行,我正在使用 SqlCommandBuilder.GetDeleteCommand()
生成删除指令并删除基础行,如果未找到该行,则我使用 SqlCommandBuilder.GetInsertCommand()
生成插入命令并使用 SqlDataAdapter.Update()
将该行插入到 table。但是该行没有被插入到数据库中的 table 中。这是我到目前为止所做的
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");
和 table
PostLikes(LikeId,PostId,UserId)
有几个问题:
- 您希望重复使用同一命令来检测该行是否存在,并为
SqlCommandBuilder
提供 SqlAdapter
。
- 您应该对初始 select 查询进行参数化,以防止 Sql 注入攻击(并且有一个小的性能优势)。 CommandBuilder 将自动参数化
Insert
/ Delete
命令
- 使用
SqlCommandBuilder
创建插入/删除命令后,您需要更改基础数据集,以便在 Update
期间对 table 进行任何更改.
- 请注意,许多 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
)
并且我假设您想要 'toggle' 使用 postId, userid
组合插入或删除一行。
我正在使用 SqlDataAdapter
在 PostLikes table 中搜索 (PostId,UserId),如果找到该行,我正在使用 SqlCommandBuilder.GetDeleteCommand()
生成删除指令并删除基础行,如果未找到该行,则我使用 SqlCommandBuilder.GetInsertCommand()
生成插入命令并使用 SqlDataAdapter.Update()
将该行插入到 table。但是该行没有被插入到数据库中的 table 中。这是我到目前为止所做的
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");
和 table
PostLikes(LikeId,PostId,UserId)
有几个问题:
- 您希望重复使用同一命令来检测该行是否存在,并为
SqlCommandBuilder
提供SqlAdapter
。 - 您应该对初始 select 查询进行参数化,以防止 Sql 注入攻击(并且有一个小的性能优势)。 CommandBuilder 将自动参数化
Insert
/Delete
命令 - 使用
SqlCommandBuilder
创建插入/删除命令后,您需要更改基础数据集,以便在Update
期间对 table 进行任何更改. - 请注意,许多 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
)
并且我假设您想要 'toggle' 使用 postId, userid
组合插入或删除一行。