使用 post 更新数据库中的现有记录
Using post to update existing records in a database
我正在编写一个 API 控制器,用于在 table 中插入和更新记录。我能够很容易地将新项目插入数据库,但我很难理解如何更新现有记录。我目前的解决方案是查询与请求具有相同UserName和DeviceId的记录数。如果计数 > 0,则执行更新查询。否则,我们执行插入查询。但我不确定如何 return 来自 countQuery 的记录数。另外,我宁愿不为此使用 patch 或 put 方法。我想要 post 方法中的所有逻辑。感谢您的帮助!
public BaseResponse Post([FromBody]PendingAttachmentRequest pending)
{
var datasource = "";
var appVersion = "";
var sessionId = "";
var updateQuery = "UPDATE PendingAttachments SET PendingCount = @PendingCount,LastUpdated = @LastUpdated,DataSource = @DataSource WHERE DeviceId = @deviceId AND WHERE UserName = @userName";
var countQuery = "SELECT count(*) PendingAttachments WHERE DeviceId = @DeviceId AND WHERE UserName = @UserName";
MobileCompleteServer.Helpers.Connection.GetHeaderInfo(out sessionId, out datasource, out appVersion);
using (var onbaseConnection = MobileCompleteServer.Helpers.Connection.Connect(sessionId, datasource))
{
var connectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
try
{
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
using (SqlCommand comm = new SqlCommand(countQuery, sqlConnection))
{
if (/*how to check if the result of countQuery is > 0*/)
{
using (SqlCommand sqlComm = new SqlCommand(updateQuery, sqlConnection))
{
sqlComm.CommandType = System.Data.CommandType.Text;
//replace that row with request body
sqlComm.Parameters.Add(new SqlParameter("@DataSource", pending.DataSource));
sqlComm.Parameters.Add(new SqlParameter("@LastUpdated", pending.LastUpdated));
sqlComm.Parameters.Add(new SqlParameter("@PendingCount", pending.PendingCount));
sqlComm.Parameters.Add(new SqlParameter("@DeviceId", pending.DeviceId));
sqlComm.Parameters.Add(new SqlParameter("@UserName", pending.UserName));
}
}
using (SqlCommand sqlCommand = new SqlCommand("sp_InsertPendingAttachments", sqlConnection))
{
sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
sqlCommand.Parameters.Add(new SqlParameter("@DataSource", pending.DataSource));
sqlCommand.Parameters.Add(new SqlParameter("@UserName", pending.UserName));
sqlCommand.Parameters.Add(new SqlParameter("@DeviceId", pending.DeviceId));
sqlCommand.Parameters.Add(new SqlParameter("@PendingCount", pending.PendingCount));
sqlCommand.Parameters.Add(new SqlParameter("@LastUpdated", pending.LastUpdated));
sqlCommand.ExecuteNonQuery();
}
}
}
return new BaseResponse();
}
catch (Exception e)
{
if (e.Message == Constants.SessionNotFound)
{
return new BaseResponse
{
Exception = Constants.SessionNotFound,
ExceptionStackTrace = e.ToString()
};
}
else
{
return new BaseResponse
{
Exception = Constants.PendingAttachmentError,
ExceptionStackTrace = e.ToString()
};
}
}
}
}
如果您不关心有多少条记录,而只想检查table中是否至少存在一条记录,则使用"exists"。它肯定会提高查询性能。所以你只需要检查真假条件:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/exists-transact-sql?view=sql-server-ver15
您还需要使用"ExecuteReader" / "ExecuteScalar"方法:Check if a record exists in the database
尝试使用 Repository 设计模式,它将您的数据访问逻辑和领域逻辑分开,它也将有助于您的代码测试table。此外,您的方法一次做很多事情,因此违反了单一职责原则。
您是否还没有一个以 deviceId
和 userName
作为参数为 GET
端点提供服务的方法?如果没有创建它并调用该方法来检查是否存在,并且根据结果,您可以调用 update
或 insert
处理程序。这样,您的 API 将更加 RESTful
和模块化,从而减少与业务逻辑的耦合并且更易于测试。
我正在编写一个 API 控制器,用于在 table 中插入和更新记录。我能够很容易地将新项目插入数据库,但我很难理解如何更新现有记录。我目前的解决方案是查询与请求具有相同UserName和DeviceId的记录数。如果计数 > 0,则执行更新查询。否则,我们执行插入查询。但我不确定如何 return 来自 countQuery 的记录数。另外,我宁愿不为此使用 patch 或 put 方法。我想要 post 方法中的所有逻辑。感谢您的帮助!
public BaseResponse Post([FromBody]PendingAttachmentRequest pending)
{
var datasource = "";
var appVersion = "";
var sessionId = "";
var updateQuery = "UPDATE PendingAttachments SET PendingCount = @PendingCount,LastUpdated = @LastUpdated,DataSource = @DataSource WHERE DeviceId = @deviceId AND WHERE UserName = @userName";
var countQuery = "SELECT count(*) PendingAttachments WHERE DeviceId = @DeviceId AND WHERE UserName = @UserName";
MobileCompleteServer.Helpers.Connection.GetHeaderInfo(out sessionId, out datasource, out appVersion);
using (var onbaseConnection = MobileCompleteServer.Helpers.Connection.Connect(sessionId, datasource))
{
var connectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
try
{
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
using (SqlCommand comm = new SqlCommand(countQuery, sqlConnection))
{
if (/*how to check if the result of countQuery is > 0*/)
{
using (SqlCommand sqlComm = new SqlCommand(updateQuery, sqlConnection))
{
sqlComm.CommandType = System.Data.CommandType.Text;
//replace that row with request body
sqlComm.Parameters.Add(new SqlParameter("@DataSource", pending.DataSource));
sqlComm.Parameters.Add(new SqlParameter("@LastUpdated", pending.LastUpdated));
sqlComm.Parameters.Add(new SqlParameter("@PendingCount", pending.PendingCount));
sqlComm.Parameters.Add(new SqlParameter("@DeviceId", pending.DeviceId));
sqlComm.Parameters.Add(new SqlParameter("@UserName", pending.UserName));
}
}
using (SqlCommand sqlCommand = new SqlCommand("sp_InsertPendingAttachments", sqlConnection))
{
sqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
sqlCommand.Parameters.Add(new SqlParameter("@DataSource", pending.DataSource));
sqlCommand.Parameters.Add(new SqlParameter("@UserName", pending.UserName));
sqlCommand.Parameters.Add(new SqlParameter("@DeviceId", pending.DeviceId));
sqlCommand.Parameters.Add(new SqlParameter("@PendingCount", pending.PendingCount));
sqlCommand.Parameters.Add(new SqlParameter("@LastUpdated", pending.LastUpdated));
sqlCommand.ExecuteNonQuery();
}
}
}
return new BaseResponse();
}
catch (Exception e)
{
if (e.Message == Constants.SessionNotFound)
{
return new BaseResponse
{
Exception = Constants.SessionNotFound,
ExceptionStackTrace = e.ToString()
};
}
else
{
return new BaseResponse
{
Exception = Constants.PendingAttachmentError,
ExceptionStackTrace = e.ToString()
};
}
}
}
}
如果您不关心有多少条记录,而只想检查table中是否至少存在一条记录,则使用"exists"。它肯定会提高查询性能。所以你只需要检查真假条件:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/exists-transact-sql?view=sql-server-ver15
您还需要使用"ExecuteReader" / "ExecuteScalar"方法:Check if a record exists in the database
尝试使用 Repository 设计模式,它将您的数据访问逻辑和领域逻辑分开,它也将有助于您的代码测试table。此外,您的方法一次做很多事情,因此违反了单一职责原则。
您是否还没有一个以 deviceId
和 userName
作为参数为 GET
端点提供服务的方法?如果没有创建它并调用该方法来检查是否存在,并且根据结果,您可以调用 update
或 insert
处理程序。这样,您的 API 将更加 RESTful
和模块化,从而减少与业务逻辑的耦合并且更易于测试。