我的DataTable Snippet是否正确写入?

时间:2011-01-04 09:34:21

标签: c# .net asp.net asp.net-ajax

   public static DataTable GetDataTable(SqlCommand sqlCmd)
    {
        DataTable tblMyTable = new DataTable();
        DataSet myDataSet = new DataSet();

        try
        {
            //1. Create connection
            mSqlConnection = new SqlConnection(mStrConnection);

            //2. Open connection
            mSqlConnection.Open();

            mSqlCommand = new SqlCommand();
            mSqlCommand = sqlCmd;

            //3. Assign Connection   
            mSqlCommand.Connection = mSqlConnection;

            //4. Create/Set DataAdapter
            mSqlDataAdapter = new SqlDataAdapter();
            mSqlDataAdapter.SelectCommand = mSqlCommand;

            //5. Populate DataSet    
            mSqlDataAdapter.Fill(myDataSet, "DataSet");

            tblMyTable = myDataSet.Tables[0];
        }
        catch (Exception ex)
        {

        }
        finally
        {
            //6. Clear objects
            if ((mSqlDataAdapter != null))
            {
                mSqlDataAdapter.Dispose();
            }

            if ((mSqlCommand != null))
            {
                mSqlCommand.Dispose();
            }

            if ((mSqlConnection != null))
            {
                mSqlConnection.Close();
                mSqlConnection.Dispose();

            }
        }

        //7. Return DataSet
        return tblMyTable;
    }
  • 我使用上面的代码返回 数据库中的记录。

  • 以上代码段将在网络上运行 期望有的申请 每天约5000名游客。

  • 返回的记录达到20,000或 过度。

  • 查看返回的记录 (只读)在分页GridView中。

使用DataReader而不是DataTable会更好吗?

注意:GridView中的两列是超链接的。

4 个答案:

答案 0 :(得分:1)

如果您想使用DataTable,那么您应该:

  • 始终SqlConnectionSqlCommand个对象放入using(..) { ... }块,以确保妥善处置

  • 尽可能晚地打开SqlConnection并立即再次关闭

  • 使用SqlDataAdapter,您甚至无需显式打开/关闭连接 - 数据适配器将为您执行此操作

  • 不要使用任何不必要的其他对象,例如DataSet - 只需直接填写DataTable

所以你的代码应该是:

public static DataTable GetDataTable(SqlCommand sqlCmd)
{
    DataTable tblMyTable = new DataTable();

    try
    {
        // Create connection
        using(SqlConnection mSqlConnection = new SqlConnection(mStrConnection))
        {
           // Assign Connection   
           sqlCmd.Connection = mSqlConnection;

           // Create/Set DataAdapter
          using(SqlDataAdapter mSqlDataAdapter = new SqlDataAdapter(sqlCmd))
          {
              mSqlDataAdapter.Fill(tblMyTable);
          }
        }
     }
    catch (Exception ex)
    {
       // handle exception
    }

    // Return DataTable
    return tblMyTable;
}

像其他一些回应者已经提到的那样:

  • 不要返回20'000行.....返回就像您的网格可以显示的那样多,更多的是浪费时间,空间和处理能力

  • 另外:我并不特别喜欢传入SqlCommand的想法 - 如果我要编写此方法,我会将SQL查询作为字符串传递并创建{{ 1}}仅在此方法内

最后的建议:在这个时代,我会尝试离开从基于行/列的编程模型 - 那就是20世纪......你一定要看看ORM - 对象关系映射器 - 可以将数据库行/列转换为编程友好的对象,然后使用它们进行编程。

查看NHibernate,Linq-to-SQL,Entity Framework v4或其他......我们仍然需要处理SqlCommandDataTable非常低级且效率不高!

答案 1 :(得分:0)

你的整个片段不是太糟糕,而是一些笔记。

1)你忽略了发生的任何异常,这可能只是在你的例子中,但如果不是那样非常糟糕。您应该记录错误。

2)你正在使用可怕的匈牙利表示形式。为了您现在或将来可以使用的其他C#开发人员的利益,您应该摆脱这种习惯。

3)向用户显示20K记录是疯狂的。渲染速度很慢,而且几乎完全无用,因为没有人会通过那么多记录。使用搜索,过滤或两者的组合提供更智能的用户界面。

至于DataAdapter / DataReader问题;它没有任何区别,因为数据适配器无论如何都在使用数据读取器。一个更好的问题可能是“我应该使用DataSet还是我自己的自定义对象来表示记录?”答案是,如果需要提供额外的功能(例如维护每条记录的状态),则应使用DataSet。在您刚刚检索到记录显示在网格上的情况下,我猜可能不会。

答案 2 :(得分:0)

为什么从数据库返回20,000或以上的记录。我认为你应该根据你的GridView页面大小来获取记录。

例如,如果您的GridView页面大小为10,那么您只能从db获得10条记录。

答案 3 :(得分:0)

1 - 如果您的数据不是特定于用户的,并且某种静态,即使它是静态的几个小时(我认为就是这种情况),您可以获取数据并存储在缓存中并显示通过这种方式将缓存数据缓存到用户,可以减少为每个用户请求重新填充数据表。

2-如果上述情况不是你的情况而不是读取块中的数据并使用分页来减少返回的数据,因为没有用户可以去看20000多行,使用分页这将使你的应用程序响应更快。

可以在上述两个点中使用缓存来增加应用程序的放置。