小编MDS*_*ens的帖子

为什么使用带有SqlTransaction的using语句?

我一直在遇到一些与我在我的代码中使用的SqlTransaction有关的问题.在我的谷歌搜索期间,我看到许多人使用带有SqlTransaction的using语句.

使用SqlTransaction这种类型的语句有什么好处和/或区别?

using (SqlConnection cn = new SqlConnection())
{
     using (SqlTransaction tr = cn.BeginTransaction())
     {
      //some code
      tr.Commit();
     }
}
Run Code Online (Sandbox Code Playgroud)

目前我的代码如下所示:

SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["T3"]);
cn.Open();
SqlTransaction tr = cn.BeginTransaction();

try
{
     //some code
     tr.Commit();
     cn.Close();
}
catch(Exception ex)
{
      tr.Rollback();
      cn.Close();
      throw ex;
}
Run Code Online (Sandbox Code Playgroud)

一种方式优于另一种方式的优势是什么?

c# using-statement

47
推荐指数
4
解决办法
5万
查看次数

为什么必须在CASE语句中对GROUP进行GROUP BY?

我正在尝试在SQL Server 2008中针对某些数据输入不一致的表运行查询,我必须处理这个问题.

表数据示例:

OrderID   Qty   Price   MarkedUpTotal
1         10    1.00    11.00
1         -1    1.00    -1.10
1         -1    1.00    1.10
Run Code Online (Sandbox Code Playgroud)

我必须处理数量为负数但MarkedUpTotal输入为正数的情况.

我想运行以下查询:

SELECT OrderID, SUM(Qty) as OrderTotalQty, 
        SUM(Qty*Price) as InternalCost,
        CASE WHEN Qty < 0 and MarkedUpTotal > 0 
             THEN sum(-1*MarkedUpTotal) 
             ELSE SUM(MarkedUpTotal) END as ClientCost  
    FROM OrderItems 
    GROUP BY OrderID
Run Code Online (Sandbox Code Playgroud)

但是,运行此查询时出现以下错误:

列数量在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

列MarkedUpTotal在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

我希望得到以下结果:

OrderID    OrderTotalQty   InternalCost   ClientCost
1          8               8.00           8.80
Run Code Online (Sandbox Code Playgroud)

我似乎很奇怪,当它们仅被CASE声明有条件地使用时,我必须是GROUP BY Qty和MarkedUpTotal.如果我删除最后一个选择(CASE语句),查询执行正常,并且不要求数量或价格在GROUP BY中.

为什么SQL需要这个?是否有一个查询可以完成上述任务?

目前我正在使用临时表来解决问题.如果需要,我会修改每个条目的MarkedUpTotal,然后在临时表的主查询中执行简单的SUM(MarkedUpTotal).

sql group-by case-statement

3
推荐指数
1
解决办法
2万
查看次数

标签 统计

c# ×1

case-statement ×1

group-by ×1

sql ×1

using-statement ×1