【问题标题】:How to get multiple rows from SQL Server in ASP.NET & performance improvement如何在 ASP.NET 和性能改进中从 SQL Server 获取多行
【发布时间】:2022-01-15 14:25:04
【问题描述】:
try
{
   SqlCommand cmd = new SqlCommand
   {
      Connection = con,
      CommandText = "GetJournalByTag",
      CommandType = System.Data.CommandType.StoredProcedure
   };

   cmd.Parameters.AddWithValue("@Tag", Tag);

   con.Open();
   cmd.ExecuteReader();
   con.Close();

   return 1;
}
catch
{
   return 0;
}

我有这样写的代码。

我打算选择标签相同的帖子,按日期排序,然后导入。

这就是我好奇的地方:

  1. 如果有 100 个帖子,我想将它们分成 10 页,每页 10 页。在这种情况下,实现它的最佳方法是什么? 任何示例或链接将不胜感激。
  2. 如果我返回一个没有con.close 的值,SqlConnection 会关闭吗?如果不关闭有什么缺点?
  3. 我想加载多篇文章,但我计划从 SQL Server 存储过程中导入 articleModel 类。执行过程时,会执行Select * from article 代码,在这种情况下返回多行。如何读取这些多行?
  4. 如果我使用像select * from article 这样的SQL 查询,速度有什么不同吗?指定所有列更好吗?还是* 更好?
  5. 如果您有任何编码技巧或在配置 SQL Server 或 ASP.NET 网站时提高性能的技巧,请告诉我!

感谢阅读。

【问题讨论】:

  • 除此之外...Can we stop using AddWithValue() already?AddWithValue is Evil。使用其他.Add(...) methods,这样就可以指定正确的SQL数据类型、参数长度等。
  • 欢迎来到 Stack Overflow。这是许多问题合而为一,这不遵循这里的指导方针。请阅读tourHow to Ask,考虑研究个别问题,如果找不到合适的答案,请独立询问。不过,我怀疑 Stack Overflow 上现有的问答已经涵盖了许多内容。
  • 其次...从ExecuteReader() 返回的SqlDataReaderIDisposable。确保正确关闭并处理它,以免用完连接池中的所有连接。此外,请务必正确处理 Read()NextResult(),否则您可能会错过 SQL Server 抛出的错误和异常,参考:Dan Guzman 的 The Curious Case of Undetected SQL Exceptions
  • 除了#3:return 1; 没有意义,你实际上并没有对读者做任何事情

标签: c# asp.net sql-server asp.net-mvc


【解决方案1】:

如果有 100 个帖子,我想将它们分成 10 页,每页 10 个

考虑使用OFFSET-FETCH 在代码中您需要跟踪当前获取的内容的位置,例如第一次 0,下一次 10 等等。在下面的示例中,您为 @Offset 传递一个参数值。

Using OFFSET and FETCH to limit the rows returned

另见 SO 帖子

注意使用* 与指定列,始终指定列。

DECLARE @Offset int = 0;
DECLARE @FetchRowCount int = 10;

SELECT P.ProductID, 
       P.ProductName, 
       P.CategoryID, 
       P.UnitPrice, 
       P.DiscontinuedDate, 
       C.CategoryName
FROM Products AS P
     INNER JOIN Categories AS C ON P.CategoryID = C.CategoryID
ORDER BY P.ProductName
OFFSET @Offset ROWS FETCH NEXT @FetchRowCount ROWS ONLY;

用于连接和命令的 C# 代码模型

public static void Demo(string tag)
{
    using (var cn = new SqlConnection())
    {
        using (var cmd = new SqlCommand())
        {
            cmd.Connection = cn;
            cmd.CommandText = "GetJournalByTag";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@Tag", SqlDbType.NVarChar).Value = tag;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2017-12-20
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    相关资源
    最近更新 更多