【问题标题】:Combining Two SQL Queries - ASP.NET组合两个 SQL 查询 - ASP.NET
【发布时间】:2020-06-03 10:32:41
【问题描述】:

我有两个 SQL 查询:

SqlCommand cmdone = new SqlCommand("update HardwareDetails Set Transstat = @Transstat where AssetNo = @AssetNo", con);
cmdone.Parameters.AddWithValue(@"Transstat", "Raised");
cmdone.Parameters.AddWithValue(@"AssetNo", txtAsset.Text);
cmdone.ExecuteNonQuery();
cmdone.Dispose();

还有:

SqlCommand cmd = new SqlCommand("Insert into TransferRequest(FrmName,FrmEmpId,ToName) values (@FrmName,@FrmEmpId,@ToName", con);
cmd.Parameters.AddWithValue(@"FrmName", txtfrm.Text);
cmd.Parameters.AddWithValue(@"FrmEmpId", Global.transferorid);
cmd.Parameters.AddWithValue(@"ToName", txtName.Text);
cmd.ExecuteNonQuery();
cmd.Dispose(); 

有没有办法将它们组合成一个查询?

【问题讨论】:

  • 你为什么要做那样的傻事?
  • 您的cmd 也应该在using 块中。如果您的查询错误,您将泄漏内存
  • @Liam 将多个 SQL 语句组合成一个命令有什么可笑的?
  • 它有什么好处?它无缘无故地破坏了单一责任原则
  • 这充其量只是微优化。同样,这不是打破 SRP 的好理由。如果您使用的是 56k 调制解调器,那可能是个问题,但现在是 2020 年......

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


【解决方案1】:

在两条SQL语句之间加一个分号,并添加所有参数。

using (SqlCommand cmd = new SqlCommand("UPDATE HardwareDetails SET Transstat = @Transstat WHERE AssetNo = AssetNo; INSERT INTO TransferRequest (FrmName, FrmEmpId, ToName) VALUES (@FrmName, @FrmEmpId, @ToName)", con))
{
    cmd.Parameters.AddWithValue(@"Transstat", "Raised");
    cmd.Parameters.AddWithValue(@"AssetNo", txtAsset.Text);
    cmd.Parameters.AddWithValue(@"FrmName", txtfrm.Text);
    cmd.Parameters.AddWithValue(@"FrmEmpId", Global.transferorid);
    cmd.Parameters.AddWithValue(@"ToName", txtName.Text);
    cmd.ExecuteNonQuery();
} 

评论:

  1. using 块内创建cmd 的最佳做法(因为它更安全)。

  2. AddWithValue should not be used,而是使用其构造函数创建 SqlParameter 并指定类型和精度。例如。 cmd.Parameters.Add(new SqlParameter("@Transstat", SqlDataType.VarChar, 6) { Value = "Raised"});

  3. 正如 Liam 指出的那样,这确实破坏了Single Responsibility Principle。就我个人而言,如果这两个语句以某种方式链接/相关,我只会使用这种方法。

【讨论】:

    【解决方案2】:
    string query = @"
    update HardwareDetails Set Transstat = @Transstat where AssetNo = @AssetNo
    
    Insert into TransferRequest(FrmName,FrmEmpId,ToName) values (@FrmName,@FrmEmpId,@ToName)";
    
    
    SqlCommand cmd= new SqlCommand(query,con);
    cmd.Parameters.AddWithValue(@"Transstat", "Raised");
    cmd.Parameters.AddWithValue(@"AssetNo", txtAsset.Text);
    cmd.Parameters.AddWithValue(@"FrmName", txtfrm.Text);
    cmd.Parameters.AddWithValue(@"FrmEmpId", Global.transferorid);
    cmd.Parameters.AddWithValue(@"ToName", txtName.Text);
    cmd.ExecuteNonQuery();
    cmd.Dispose();
    
    

    【讨论】:

    • 为了公平起见:cmd 应该在 using 块中。
    • 他正在调用 dispose,所以我认为没有必要
    • sigh...如果抛出异常,则永远不会调用 Dispose,这将导致内存泄漏...这就是 using 存在的原因
    • oooooooh 太好了,非常感谢 C# 8 还提供了这个新功能,您可以在其中执行 using var cmd = new sqlcommand() 之类的操作,它会让您的方法像 using 块一样用于cmd
    • 不,我的意思是作为关键字,请看这里:docs.microsoft.com/en-us/dotnet/csharp/whats-new/…
    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2019-02-16
    • 2020-07-08
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多