C# - SQL 数据库 - 发送查询以更新记录但是太多的更新请求导致一些被遗漏
C# - SQL Database - Sending query to update records however too many update requests cause some to get missed
我到处搜索,如有遗漏,请见谅。
当我 运行 来源时,没有出现任何错误,看起来一切正常,但是当我检查数据库时,只有一些记录 updated/added 而其他的被错过了。
目前的更新率在每秒 1 次到每秒 25 次之间变化(有些 headroom/just 以防万一,但通常在 15 次左右)。
在本节中,我查询数据库以提取现有值,对这些值进行调整,然后将其保存回数据库。
下面是更新 SQL 数据库的代码片段,大约有 43 列 正在更新(有些可能保持相同的值,但它们正在重新已添加)。
有什么方法可以确保所有更新请求都通过并成功更新?
try
{
MySqlCommand cmd2 = connection.CreateCommand();
connection.Open();
cmd2.CommandType = CommandType.Text;
cmd2.CommandText = "UPDATE user_information SET exampleValue = @exampleValue WHERE username = @username";
cmd2.Parameters.AddWithValue("@username", username);
cmd2.Parameters.AddWithValue("@exampleValue", exampleValue);
cmd2.ExecuteNonQuery();
connection.Close();
}
catch (Exception ex)
{
throw;
}
finally
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
//this.LoadData();
}
}
为了更好的比较,使用LTRIM & RTRIM i-e LTRIM(RTRIM(username))
in SQL
and in C#
use String.Trim() i-e usename.Trim()
LTRIM(RTRIM(username))
将删除数据库中用户名的额外空格,例如。 ' Smith ' -> 'Smith' 和 username.Trim()
删除输入的空格
所以你替换行
cmd2.CommandText = "UPDATE user_information SET exampleValue = @exampleValue WHERE username = @username";
cmd2.Parameters.AddWithValue("@username", username);
和
cmd2.CommandText = "UPDATE user_information SET exampleValue = @exampleValue WHERE LTRIM(RTRIM(username)) = @username";
cmd2.Parameters.AddWithValue("@username", username.Trim());
为了避免区分大小写的比较,使用LOWER i-e LOWER(username)
in SQL
and in C#
use String.ToLower(),所以username.ToLower()
现在,代码就是这样
cmd2.CommandText = "UPDATE user_information SET exampleValue = @exampleValue WHERE LOWER(LTRIM(RTRIM(username))) = @username";
cmd2.Parameters.AddWithValue("@username", username.Trim().ToLower());
根据您的代码段,您更新数据的方式没有错。但我观察到的一件事是你传递参数的方式。在那种情况下,您没有指定参数的数据类型。所以我假设'@username'和'@exampleValue'是字符串。
在某些方面,如果您 table 中列的数据类型与参数的数据类型不匹配。可能会导致数据更新失败
如果您能向我们提供您的table结构以进一步评估您的问题,那就更好了。
此致。
我到处搜索,如有遗漏,请见谅。
当我 运行 来源时,没有出现任何错误,看起来一切正常,但是当我检查数据库时,只有一些记录 updated/added 而其他的被错过了。
目前的更新率在每秒 1 次到每秒 25 次之间变化(有些 headroom/just 以防万一,但通常在 15 次左右)。
在本节中,我查询数据库以提取现有值,对这些值进行调整,然后将其保存回数据库。
下面是更新 SQL 数据库的代码片段,大约有 43 列 正在更新(有些可能保持相同的值,但它们正在重新已添加)。
有什么方法可以确保所有更新请求都通过并成功更新?
try
{
MySqlCommand cmd2 = connection.CreateCommand();
connection.Open();
cmd2.CommandType = CommandType.Text;
cmd2.CommandText = "UPDATE user_information SET exampleValue = @exampleValue WHERE username = @username";
cmd2.Parameters.AddWithValue("@username", username);
cmd2.Parameters.AddWithValue("@exampleValue", exampleValue);
cmd2.ExecuteNonQuery();
connection.Close();
}
catch (Exception ex)
{
throw;
}
finally
{
if (connection.State == ConnectionState.Open)
{
connection.Close();
//this.LoadData();
}
}
为了更好的比较,使用LTRIM & RTRIM i-e LTRIM(RTRIM(username))
in SQL
and in C#
use String.Trim() i-e usename.Trim()
LTRIM(RTRIM(username))
将删除数据库中用户名的额外空格,例如。 ' Smith ' -> 'Smith' 和 username.Trim()
删除输入的空格
所以你替换行
cmd2.CommandText = "UPDATE user_information SET exampleValue = @exampleValue WHERE username = @username";
cmd2.Parameters.AddWithValue("@username", username);
和
cmd2.CommandText = "UPDATE user_information SET exampleValue = @exampleValue WHERE LTRIM(RTRIM(username)) = @username";
cmd2.Parameters.AddWithValue("@username", username.Trim());
为了避免区分大小写的比较,使用LOWER i-e LOWER(username)
in SQL
and in C#
use String.ToLower(),所以username.ToLower()
现在,代码就是这样
cmd2.CommandText = "UPDATE user_information SET exampleValue = @exampleValue WHERE LOWER(LTRIM(RTRIM(username))) = @username";
cmd2.Parameters.AddWithValue("@username", username.Trim().ToLower());
根据您的代码段,您更新数据的方式没有错。但我观察到的一件事是你传递参数的方式。在那种情况下,您没有指定参数的数据类型。所以我假设'@username'和'@exampleValue'是字符串。
在某些方面,如果您 table 中列的数据类型与参数的数据类型不匹配。可能会导致数据更新失败
如果您能向我们提供您的table结构以进一步评估您的问题,那就更好了。
此致。