C# 如何确保全局临时表保持不变
在foreach语句中,将调用大约5个不同的存储过程,它们都依赖于同一个全局临时表 由于此方法可能有100个不同的线程同时运行,我如何确保: 如何确保全局临时表仅在此方法**UpdateToUp期间保持不变**C# 如何确保全局临时表保持不变,c#,sql,.net,sql-server,tsql,C#,Sql,.net,Sql Server,Tsql,在foreach语句中,将调用大约5个不同的存储过程,它们都依赖于同一个全局临时表 由于此方法可能有100个不同的线程同时运行,我如何确保: 如何确保全局临时表仅在此方法**UpdateToUp期间保持不变** private DataTable Updatetroup(ProductCatalogSyncData syncDataModel, string connectionString) { var ds = syncDataModel.SyncDataSet; var t
private DataTable Updatetroup(ProductCatalogSyncData syncDataModel, string connectionString)
{
var ds = syncDataModel.SyncDataSet;
var troupCommand = new SqlCommand();
var troupConnection = new SqlConnection(connectionString);
var dtResults = new DataTable("BillingIds");
var syncConfig = syncDataModel.XDataMapping;
string EntityName;
//inside of this foreach statement is where i am calling multiple stored procedures that need to make use of the same global temporary table
foreach (DataTable dt in ds.Tables)
{
EntityName =
StringDefaultIfNull(
syncConfig.Root.XPathSelectElement("./entity[@name='" + dt.TableName + "']"),
"troupTableName").Substring(3);
troupCommand.CommandType = CommandType.StoredProcedure;
troupCommand.CommandText = "troup720_P_" + EntityName + "Sync";
var entityNameParam = new SqlParameter("@EntityName", dt.TableName);
troupCommand.Parameters.Clear();
troupCommand.Parameters.Add(entityNameParam);
var tblParam = new SqlParameter("@O720_" + EntityName, SqlDbType.Structured);
tblParam.Value = dt;
troupCommand.Parameters.Add(tblParam);
troupCommand.Connection = troupConnection;
try
{
// Define the data adapter and fill the dataset
using (var da = new SqlDataAdapter(troupCommand))
{
da.Fill(dtResults);
}
}
finally
{
if (troupConnection.State == ConnectionState.Open)
troupConnection.Close();
}
}
return dtResults;
}
假设此方法由100个不同的线程调用,如何确保每个线程只获得其自己的全局临时表?全局临时表就是这样…全局的。没有条件全局作用域。当全局临时表存在时,它将可用于任何连接,并且一旦没有引用它的连接,它将被删除。在我看来,全球临时工正是你在这里所需要的。您将面临大量并发问题。但是,如果创建临时表,它将可用于从创建临时表的过程调用的任何过程。它将是线程安全的。@SeanLange如果我将全局临时值转换为常规临时值,那么上述方法中的所有内容都可以访问该常规临时值吗?而不是您目前编写的方式。现在,您正在通过循环的每个迭代关闭并重新打开连接。理想情况下,无论您的临时表如何,您都不应该这样做。您应该做的是将连接包装在USING语句中,并在循环期间保持其打开状态。然后,如果您在循环之前创建临时表,它将始终可用,因为临时表属于连接。建议:不要创建临时表,而是创建一个带有标识行的方法的表(例如,放入
newid
列,并将其与每一行一起加载)。这将使您不再担心临时持久性,使您能够实际检查数据的中流,并使您能够通过在您认为应该清除数据的任何点清除数据来管理数据的生命周期,而不是依赖数据库引擎来执行此操作。全局临时表的问题在于,您无法保证其持久性—您可能会遇到全局临时表被清除的情况,然后您就被卡住了。因此,您需要一个本质上根本不是全局的全局临时表,并且不受数据库认为合适的临时性的约束@Macknet是正确的——只要根据您的需要正确地设计和使用一张桌子。桌子上有你想要和需要的所有设施。