【问题标题】:Shortening data access code... would this work?缩短数据访问代码...这可行吗?
【发布时间】:2012-12-11 15:32:48
【问题描述】:

我正在查询数据,如果数据不存在,我插入它。如果是这样,我会做其他事情:

SqlCommand checkHead = new SqlCommand("SELECT * FROM TABLE WHERE ORDER_NO = '" + orderNo + "';", connection);
SqlDataReader checkHeadReader = checkHead.ExecuteReader(CommandBehavior.SingleRow);

if (!checkHeadReader.HasRows)
{
    checkHeadReader.Close();
    addHead.ExecuteNonQuery();
}

但我想知道是否有更短的编码方式?下面的代码会起作用吗?

SqlCommand checkHead = new SqlCommand("SELECT * FROM TABLE WHERE ORDER_NO = ' + orderNo + "';", connection);

if(checkHead.ExecuteReader(CommandBehavior.SingleRow).HasRows)
    addHead.ExecuteNonQuery();
else //this order already exists
    Server.Transfer(@"~/Views/Error.aspx");

【问题讨论】:

  • 你尝试的时候发生了什么?
  • 您需要关闭阅读器。
  • 关闭阅读器,检查sql注入,不要使用select *而是选择count(*)或者exists。
  • 如果第一个示例中没有行,您似乎正在执行addHead 命令,并且仅当第二个示例中有行时才执行它。除此之外,它们看起来或多或少是等效的。假设您有一个编译器和一台计算机可以使用,那么确定它是否有效的最好方法就是自己尝试一下。
  • @SLaks 超出范围时阅读器不会自动关闭吗?如果很重要,您可以链接到解释吗?

标签: c# asp.net sqlcommand


【解决方案1】:

ExecuteScalar 非常适合这个,例如

using (SqlCommand cmdCheck = new SqlCommand("Select Count(*) From Table Where Order_No = '" + orderNo + "'", connection))
{
    int nExists = (int)cmdCheck.ExecuteScalar();
    if (nExists==0) addHead.ExecuteNonQuery();
}

【讨论】:

  • 这实际上是一种更短的方法,也很简洁,尽管我想你可能会争辩说缺少一行来做 addHead。
  • 但是第一行不会编译
  • 你说的很对,我已经修改了一个错字,但它确实回答了这个问题,你不应该这么快给我-1。
  • 这看起来是一个更简洁的解决方案......在代码的这个阶段我已经在 using{} 语句中,你可以嵌套 using 语句吗?
  • 这并不愚蠢 :-) 我们都必须学习,这是一种乐趣。
猜你喜欢
  • 2012-01-24
  • 2023-04-10
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多