• 使用 ADO.NET 的 ExecuteScalar 方法返回单一值


    (本文在版工的旧 Blog 中,发表日期为 2007/03/31)
    (本文有些 Hyperlink 是連到台灣的網站,內地的網友可能會無法開啟連結)

    若您程序中执行的 SQL statement Stored Procedure,只是要返回计算过的「单一值」,例如:
    SELECT Count(*) FROM 员工数据表

    或只会回传符合条件的「第一笔」record 的「第一个」column 其值,例如:
    SELECT 电子信箱 FROM 员工数据表 WHERE 姓名= 'David'

    我们即可用 Command 对象的 ExecuteScalar 方法 (ADO.NET 1.x 即支援。DbCommand 对象则要 .NET 2.0 才支持),以回传数据集中第一个 row 的第一个 column 其存储值,并忽略其它无用的数据;此种做法比起用ExecuteReader 方法回传「多组」record,再指定给 DataReader 对象,再逐一比对数据,可更有效地节省系统资源并提升「 (performance)」。


    但由于 ExecuteScalar 方法回传的必为 Object 类型,因此必须由程序员,手动将其强制转型为 .NET int string 等想要的类型,以便直接指派给 int string 类型的变量,或显示在页面上的控件中,如下所示:
    string theMail = (string)cmd.ExecuteScalar();

    因此使用 ExecuteScalar 方法时,在程序中必须先确定,承接回传值的变量其类型为何,否则会发生转型错误。此外,在上例中,若「员工数据表」内有超过一个以上叫做「David」的员工,则 ExecuteScalar 方法只会回传「第一个」叫做 David 的员工其电子信箱,而忽略其它亦符合条件的数据。


    此外,ExecuteScalar 方法不只可以用在数据库的 SELECT 作业,亦可用于 INSERT 作业。假设我们想要在 INSERT 一笔 record 至数据库后,马上取得刚才新增那一笔 record 的 Identity (自动增号) 的值,可用下列 SQL statement 达成:
    string strSql = "INSERT INTO 数据表 (name, age) VALUES ('David', 20); Select @@Identity";

    此时,我们即可用 ExecuteScalar 方法,取代 ExecuteNonQuery 方法,去执行上述这一段 SQL statement,以便返回一笔计算过的「单一值」,亦即最新的 Identity 流水号码,关键 ADO.NET 代码如下:

    SqlConnection conn = new SqlConnection(strConnString);
    SqlCommand cmd 
    = new
     SqlCommand(strSqlStr, conn);

    try

    {
        conn.Open();
        
    if (conn.State ==
     ConnectionState.Open)
        
    {
            
    // 返回最新的 Identity 流水号码

            intNewestSerialNum = Convert.ToInt32(cmd.ExecuteScalar());
        }


    }

    catch (SqlException ex)
    {
        


     

  • 相关阅读:
    托付和事件的使用
    在使用supervisord 管理tomcat时遇到的小问题
    无法安装vmware tools的解决方PLEASE WAIT! VMware Tools is currently being installed on your system. Dependin
    (转)Openlayers 2.X加载高德地图
    (转)openlayers实现在线编辑
    (转) Arcgis for js加载百度地图
    (转)Arcgis for js加载天地图
    (转) 基于Arcgis for Js的web GIS数据在线采集简介
    (转) Arcgis for js之WKT和GEOMETRY的相互转换
    (转)Arcgis for Js之Graphiclayer扩展详解
  • 原文地址:https://www.cnblogs.com/WizardWu/p/1239616.html
Copyright © 2020-2023  润新知