C# 雷利街区。我没有足够的能力处理块到块的通信…@kingyau我不主张处理任何错误。更改功能以使用生成的随机字符串对表的主键执行SELECT查询。如果它不存在,请进行插入。@kingyau-为了清晰起见,我添加了一段psuedo代码示例。哇,我还以为你说的是
C# 雷利街区。我没有足够的能力处理块到块的通信…@kingyau我不主张处理任何错误。更改功能以使用生成的随机字符串对表的主键执行SELECT查询。如果它不存在,请进行插入。@kingyau-为了清晰起见,我添加了一段psuedo代码示例。哇,我还以为你说的是,c#,sql,sql-server,sql-insert,C#,Sql,Sql Server,Sql Insert,雷利街区。我没有足够的能力处理块到块的通信…@kingyau我不主张处理任何错误。更改功能以使用生成的随机字符串对表的主键执行SELECT查询。如果它不存在,请进行插入。@kingyau-为了清晰起见,我添加了一段psuedo代码示例。哇,我还以为你说的是do{INSERT}while(success)。。你的比我想象的要好。非常感谢:)@kingyau-我添加了更多的评论,因为这种检查和插入方法性能不高,本质上是糟糕的数据库设计。希望它们能为您带来正确解决方案的清晰性,而不是“适合我”的解决方
雷利街区。我没有足够的能力处理块到块的通信…@kingyau我不主张处理任何错误。更改功能以使用生成的随机字符串对表的主键执行SELECT查询。如果它不存在,请进行插入。@kingyau-为了清晰起见,我添加了一段psuedo代码示例。哇,我还以为你说的是
do{INSERT}while(success)
。。你的比我想象的要好。非常感谢:)@kingyau-我添加了更多的评论,因为这种检查和插入方法性能不高,本质上是糟糕的数据库设计。希望它们能为您带来正确解决方案的清晰性,而不是“适合我”的解决方案。如果此解决方案已回答您的问题,请将其标记为已接受并进行投票。您建议使用什么循环?我只知道如何使用if-else和for-loop.“在c#中执行insert或任何sql语句都是不好的,因为它易于sql注入”,这既有误导性,也有错误。当您不参数化查询时,就会发生SQL注入。由于OP在代码示例中正确地执行了此操作,因此您的语句不起作用。另一方面,C#中的SQL既不坏也不好,它是处理解决方案的一种单独方式。+1,但您需要将整个操作包装在事务中,并将事务隔离级别设置为可序列化。肯定需要事务。我认为带有tablockx和holdlock提示的select也可以工作。基本上,read和delete都需要阻止其他读卡器。编辑以将其与此合并,请确保您偶尔重新填充池,以确保它永远不会用完(假设您没有预先填充所有可能的组合)。此重新填充作业将遇到与原始问题相同的问题,即查找唯一未使用的值,但至少它将在单独的过程中,而不是每次执行应用程序事务时。
try
{
SqlConnection con = new SqlConnection(ConnectionString);
con.Open();
var key = RandomString(6);
SqlCommand insertCommand = new SqlCommand("INSERT INTO tableName(d1, d2, d3) VALUES (@0, @1, @2)", con);
insertCommand.Parameters.Add(new SqlParameter("0", key));
insertCommand.Parameters.Add(new SqlParameter("1", "values"));
insertCommand.Parameters.Add(new SqlParameter("2", DateTime.Now));
var rowCount = insertCommand.ExecuteNonQuery();
con.Close();
if (rowCount < 1)
{
label.Text = "OMG it is Fail :(";
return false;
}
else
{
label.Text = "HEY ~~~ inserted";
return true;
}
}
catch (Exception ex)
{
label.Text = ex.Message;
return false;
}
try
{
SqlConnection con = new SqlConnection(ConnectionString);
con.Open();
int count = 1;
string key = string.Empty;
while (count > 0)
{
key = RandomString(6);
SqlCommand selectCommand = new SqlCommand("SELECT COUNT(*) FROM tableName WHERE d1 = @0", con);
selectCommand.Parameters.Add(new SqlParameter("0", key));
count = (int)selectCommand.ExecuteScalar();
}
SqlCommand insertCommand = new SqlCommand("INSERT INTO tableName(d1, d2, d3) VALUES (@0, @1, @2)", con);
insertCommand.Parameters.Add(new SqlParameter("0", key));
insertCommand.Parameters.Add(new SqlParameter("1", "values"));
insertCommand.Parameters.Add(new SqlParameter("2", DateTime.Now));
var rowCount = insertCommand.ExecuteNonQuery();
con.Close();
if (rowCount < 1)
{
label.Text = "OMG it is Fail :(";
return false;
}
else
{
label.Text = "HEY ~~~ inserted";
return true;
}
}
catch (Exception ex)
{
label.Text = ex.Message;
return false;
}