【问题标题】:Page Life Cycle, does db connection go in Page_Load页面生命周期,数据库连接是否进入 Page_Load
【发布时间】:2011-06-15 14:25:07
【问题描述】:

目前我有以下代码:

void Page_Load(object sender, System.EventArgs e)
 {       
       string connectionString = "server=abc;database=abc;uid=abc;pwd=1234";
       SqlConnection mySqlConnection = new SqlConnection(connectionString);
       string procedureString = "Callin_Insert";
       SqlCommand mySqlCommand = mySqlConnection.CreateCommand();
       mySqlCommand.CommandText = procedureString;
       mySqlCommand.CommandType = CommandType.StoredProcedure;
       mySqlCommand.Parameters.Add("@LVDate", SqlDbType.DateTime).Value = DateTime.Now;
       mySqlCommand.Parameters.Add("@LVTime", SqlDbType.DateTime).Value = DateTime.Now;
       mySqlCommand.Parameters.Add("@CuID", SqlDbType.Int).Value = CustID;
       mySqlCommand.Parameters.Add("@Type", SqlDbType.Int).Value = Keypress;
       mySqlConnection.Open();
       mySqlCommand.ExecuteNonQuery();
       SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter();
       mySqlDataAdapter.SelectCommand = mySqlCommand;
       mySqlConnection.Close();
}

基本上,我在 page_load 期间打开了与数据库的连接。我也在 page_load 中关闭了该连接。我的部分问题是 CustID 和 Keypress 没有通过,因为它们发生在页面生命周期的后期。打开连接的最佳方法是什么,获取 2 个变量(当用户输入它们时),将它们传递给数据库,然后关闭连接。

我尝试过运行它_OnLoad。但这也不起作用。

非常感谢任何想法或建议。

【问题讨论】:

  • because they occur later in the page life cycle 当所有数据都可用时,为什么不在页面生命周期的后期执行所有这些操作?
  • 我已经尝试过,通过在 OnLoad 部分添加所有这些,但没有运气。您建议在页面生命周期的哪个位置添加它?

标签: c# asp.net database-connection parameter-passing page-lifecycle


【解决方案1】:

SqlConnection 的第一个是 IDisposible 接口,这意味着用这样的 using 语句包装代码会更安全。

string connectionString = "server=abc;database=abc;uid=abc;pwd=1234";
using (SqlConnection mySqlConnection = new SqlConnection(connectionString))
{
    string procedureString = "Callin_Insert";
    SqlCommand mySqlCommand = new SqlCommand(procedureString, mySqlConnection);
    mySqlCommand.CommandType = CommandType.StoredProcedure;

    mySqlCommand.Parameters.Add("@LVDate", SqlDbType.DateTime).Value = DateTime.Now;
    mySqlCommand.Parameters.Add("@LVTime", SqlDbType.DateTime).Value = DateTime.Now;
    mySqlCommand.Parameters.Add("@CuID", SqlDbType.Int).Value = CustID;
    mySqlCommand.Parameters.Add("@Type", SqlDbType.Int).Value = Keypress;

    mySqlConnection.Open();
    mySqlCommand.ExecuteNonQuery();

    //i have no idea what does this mean, data adapter is for filling Datasets and DataTables
    SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter();
    mySqlDataAdapter.SelectCommand = mySqlCommand;
}

其次,我为您提供使用 SqlDataSourceObject 控件,这将使您更容易处理像您这样的案例。

它将知道如何处理您尚未实现但应该实现的 Page.IsPostBack、分页和其他您需要的东西。

【讨论】:

  • SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(); mySqlDataAdapter.SelectCommand = mySqlCommand;被添加,写入参数; @LVDate、@LVTime、@CuID、@Type 返回数据库。我尝试了这个并且它有效,但只有当我将所有内容都放入页面加载时才有效。那么,你上面介绍的代码,你会把它放在循环的哪个位置呢?
  • 正如我在 Second Of All 中所说的,我会使用 SqlDataSource 控件或 ObjectDataSource 控件来处理 Page LiveCycles
  • 好的,我知道了,谢谢。以及关闭连接的问题。我看到它在哪里打开,但没有关闭,这是 IDisposible 接口的一部分吗?
  • 有时由于任何错误,您都无法到达 connection.close() 行。使用 IDisposible 对象允许您在任何情况下使用“使用”语句关闭这些对象。 SqlDataReader 或任何类型的 DataReader 也是如此,无论是 XML 还是 Webrequest。
【解决方案2】:

认为这里存在一些问题...首先,您为什么要运行查询,然后将其传递给数据适配器?数据适配器将在查询时运行选择命令。

我建议在您的 aspx 页面上创建一个 SqlDataSource(而不是代码隐藏)并将您的控件绑定到它。然后连接 Selecting 事件并在其中填充您的参数。这应该在页面生命周期的后期发生,这样您的参数值就会被设置。

【讨论】:

  • +1 表示不调用ExecuteNonQuery,但-1 表示他继续使用SqlDataAdapterSqlDataSource 更好。
  • True J​​ohn,实际上我的意思是 aspx 中的 SqlDataSource。这就是 Selecting 事件。自从我使用网络表单已经有一段时间了,但我应该先检查一下,真让我感到羞耻!
猜你喜欢
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多