在页面加载时使用存储过程创建临时表

时间:2013-05-24 13:59:59

标签: c# asp.net ado.net

我想在这些事件中创建一个临时表,具体取决于哪个是真实应用程序中最谨慎的:页面加载事件,或第二次单击按钮。我有一个简单的存储过程

create proc spMakeTempTable
create table #tempTable (columnName varchar(50))

和c#

   protected void Page_Load(object sender, EventArgs e)
    {
        txtDrugList.Focus();
        string cs = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;
        using (var con = new SqlConnection(cs))
        {
            using (var cmd = new SqlCommand("spMakeTempTable", con))
            {
                con.Open();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.ExecuteNonQuery();
            }
        }

    }

我需要临时表特定于特定会话,因此如果不同的人访问该站点,将为他们创建不同的临时表。但是,当我运行应用程序并加载页面时,不会创建临时表。如果我更改sproc以创建一个全局临时表,它可以工作。我不认为这是我想要的,因为我希望每个临时表都是特定于访问者的。如果访问者刷新页面,那么临时表将被销毁并重新创建。

其次,在页面加载事件上执行proc是否明智,还是应该将此逻辑放入按钮单击事件中?

1 个答案:

答案 0 :(得分:2)

您的表可能正在创建中。问题是,一旦连接关闭,本地临时表就会被销毁,这种情况发生在using (var con = new SqlConnection(cs))块的末尾。

暂时忽略为什么这种方法可能会或可能不是一个好主意,您在网页代码范围内创建的任何SqlConnection对象将在返回响应后立即处理。如果你真的想使用本地临时表并让它们在用户请求之间保持不变,你就必须做一些事情,比如将SqlConnection对象添加到静态类中的集合而不是处理它们(包括不将它们放在using语句中) 。然后,当您需要检索或向temp表写入更多数据时,您将在将来的请求中从该集合中检索用户的SqlConnection对象。您仍然需要担心连接打开多长时间以及何时处置SqlConnection对象的其他问题。

虽然我不知道你想要完成什么,但你可能想要考虑在临时表中存储用户特定数据的替代方法。