WizardWu 編程網

一位台灣的工程師,接觸 .NET 逾十年,近年研究 SQL Server、Performance Tuning、手機應用

博客园 首页 新随笔 联系 订阅 管理
  104 随笔 :: 0 文章 :: 1098 评论 :: 55万 阅读
(本文在版工的旧 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)
{
    
复制代码


 

posted on   WizardWu  阅读(1124)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示