惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
博客园 - Franky
MyScale Blog
MyScale Blog
L
LangChain Blog
Martin Fowler
Martin Fowler
Recent Announcements
Recent Announcements
Stack Overflow Blog
Stack Overflow Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
量子位
A
About on SuperTechFans
C
Check Point Blog
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
小众软件
小众软件
Apple Machine Learning Research
Apple Machine Learning Research
I
InfoQ
V
Visual Studio Blog
Vercel News
Vercel News
B
Blog
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
U
Unit 42

博客园 - NanKe Sir's Blog

设置RDLC报表参数 - NanKe Sir's Blog 用SQL语句查询累计值 C#调用存储过程通用类3 Winform控件拖动 TreeView查找 在 DataGridView 中实现类似 Ctrl + F 的查找功能 正则表达式使用 Collapsing margins CSS基础 打开 mdi 窗体的子窗体 从绑定了数据源的 ListBox 中删除多个选定项 计算24点代码javascript 对数据库表进行简单的增删改查操作的通用类 SQL连接查询AND和WHERE的不同 我为什么憎恨Framework SQL选择所最近一条记录 Sql Server 日期格式转换 INSERT INTO SELECT FROM 的用法 无法将输入 xml 文件内容转换为数据集
C#存储过程调用
NanKe Sir's Blog · 2008-09-26 · via 博客园 - NanKe Sir's Blog

// ==============================
// Author:  ZhiQiao
// Date:    2008/09/16
// File:    StoreProcedure.cs
// ==============================

namespace Kenwood.Product.DataAccessHelper
{
    
using System;
    
using System.Data;
    
using System.Data.SqlClient;
    
    
//// <summary>
    
/// 存储过程。
    
/// </summary>

    
public class StoreProcedure
    {
        
// 连接字符串。
        private string connectionString;
        
// 存储过程名称。
        private string storeProcedureName;//// <summary>
        
/// 初始化 DataAccessHelper.StoreProceduer 对象。
        
/// </summary>
        
/// <param name="connectionString">数据库连接字符串。</param>

        
public StoreProcedure(string connectionString) {
            
this.connectionString = connectionString;
        }
//// <summary>
        
/// 初始化 DataAccessHelper.StoreProceduer 对象。
        
/// </summary>
        
/// <param name="connectionString">数据库连接字符串。</param>
        
/// <param name="storeProcedureName">存储过程名称。</param>
        public StoreProcedure(string connectionString, string storeProcedureName) {
            
this.connectionString = connectionString;
            
this.storeProcedureName = storeProcedureName;
        }
//// <summary>
        
/// 获取或设置存储过程名称。
        
/// </summary>
        public string StoreProcedureName {
            
get { return this.storeProcedureName; }
            
set { this.storeProcedureName = value; }
        }
//// <summary>
        
/// 执行操作类(Insert/Delete/Update)存储过程。
        
/// </summary>
        
/// <param name="paraValues">传递给存储过程的参数值列表。</param>
        
/// <returns>受影响的行数。</returns>
        public int ExecuteNonQuery(params object[] paraValues) {using (SqlConnection connection = new SqlConnection(this.connectionString)) {

                SqlCommand command 

= this.CreateSqlCommand(connection);try {
                    
this.DeriveParameters(command);
                    
this.AssignParameterValues(command, paraValues);
                    connection.Open();
                    
int affectedRowsCount = command.ExecuteNonQuery();
                    
return affectedRowsCount;
                } 
catch {
                    
throw;
                }
            }
        }
//// <summary>
        
/// 执行存储过程,返回 System.Data.DataTable。
        
/// </summary>
        
/// <param name="paraValues">传递给存储过程的参数值列表。</param>
        
/// <returns>包含查询结果的 System.Data.DataTable。</returns>
        public DataTable ExecuteDataTable(params object[] paraValues) {using (SqlConnection connection = new SqlConnection(this.connectionString)) {

                SqlCommand command 

= this.CreateSqlCommand(connection);try {
                    
this.DeriveParameters(command);
                    
this.AssignParameterValues(command, paraValues);
                    SqlDataAdapter adapter 
= new SqlDataAdapter(command);
                    DataTable dataTable 
= new DataTable();
                    adapter.Fill(dataTable);
                    
return dataTable;
                } 
catch {
                    
throw;
                }
            }
        }
//// <summary>
        
/// 执行存储过程,填充指定的 System.Data.DataTable。
        
/// </summary>
        
/// <param name="dataTable">用于填充查询结果的 System.Data.DataTable。</param>
        
/// <param name="paraValues">传递给存储过程的参数值列表。</param>
        public void ExecuteFillDataTable(DataTable dataTable, params object[] paraValues) {using (SqlConnection connection = new SqlConnection(this.connectionString)) {

                SqlCommand command 

= this.CreateSqlCommand(connection);try {
                    
this.DeriveParameters(command);
                    
this.AssignParameterValues(command, paraValues);
                    connection.Open();
                    SqlDataAdapter adapter 
= new SqlDataAdapter(command);
                    adapter.Fill(dataTable);
                } 
catch {
                    
throw;
                }
            }
        }
        
        
//// <summary>
        
/// 执行存储过程返回 System.Data.SqlClient.SqlDataReader,
        
/// 在 System.Data.SqlClient.SqlDataReader 对象关闭时,数据库连接自动关闭。
        
/// </summary>
        
/// <param name="paraValues">传递给存储过程的参数值列表。</param>
        
/// <returns>包含查询结果的 System.Data.SqlClient.SqlDataReader 对象。</returns>
        public SqlDataReader ExecuteDataReader(params object[] paraValues) {using (SqlConnection connection = new SqlConnection(this.connectionString)) {

                SqlCommand command 

= this.CreateSqlCommand(connection);try {
                    
this.DeriveParameters(command);
                    
this.AssignParameterValues(command, paraValues);
                    connection.Open();
                    
return command.ExecuteReader(CommandBehavior.CloseConnection);
                } 
catch {
                    
throw;
                }
            }
        }
//// <summary>
        
/// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
        
/// </summary>
        
/// <param name="paraValues">传递给存储过程的参数值列表。</param>
        
/// <returns>结果集中第一行的第一列或空引用(如果结果集为空)。</returns>
        public object ExecuteScalar(params object[] paraValues) {using (SqlConnection connection = new SqlConnection(this.connectionString)) {

                SqlCommand command 

= this.CreateSqlCommand(connection);try {
                    
this.DeriveParameters(command);
                    
this.AssignParameterValues(command, paraValues);
                    connection.Open();
                    
return command.ExecuteScalar();
                } 
catch {
                    
throw;
                }
            }
        }
//// <summary>
        
/// 从在 System.Data.SqlClient.SqlCommand 中指定的存储过程中检索参数信息并填充指定的 
        
/// System.Data.SqlClient.SqlCommand 对象的 System.Data.SqlClient.SqlCommand.Parameters 集  合。
        
/// </summary>
        
/// <param name="sqlCommand">将从其中导出参数信息的存储过程的 System.Data.SqlClient.SqlCommand 对象。</param>
        internal void DeriveParameters(SqlCommand sqlCommand) {
            
try {
                sqlCommand.Connection.Open();
                SqlCommandBuilder.DeriveParameters(sqlCommand);
                sqlCommand.Connection.Close();
            } 
catch {
                
if (sqlCommand.Connection != null) {
                    sqlCommand.Connection.Close();
                }
                
throw;
            }
        }
// 用指定的参数值列表为存储过程参数赋值。
        private void AssignParameterValues(SqlCommand sqlCommand, params object[] paraValues) {
            
if (paraValues != null) {
                
if ((sqlCommand.Parameters.Count - 1!= paraValues.Length) {
                    
throw new ArgumentNullException("The number of parameters does not match number of values for stored procedure.");
                }
                
for (int i = 0; i < paraValues.Length; i++) {
                    sqlCommand.Parameters[i 
+ 1].Value = (paraValues[i] == null? DBNull.Value : paraValues[i];
                }
            }
        }
// 创建用于执行存储过程的 SqlCommand。
        private SqlCommand CreateSqlCommand(SqlConnection connection) {

            SqlCommand command 

= new SqlCommand(this.storeProcedureName, connection);
            command.CommandType 
= CommandType.StoredProcedure;return command;
        }
    }
}