網站首頁 編程語言 正文
一、使用SqlParameter的方式
代碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Configuration; using System.Collections.ObjectModel; using System.Reflection; namespace ExecuteProcBySQLServer { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btn_LoadData_Click(object sender, EventArgs e) { // 存儲過程名稱 string strProcName = "usp_yngr_getInfectionCard_test"; //定義存儲過程的參數數組 SqlParameter[] paraValues = { new SqlParameter("@BeginTime",SqlDbType.VarChar), new SqlParameter("@EndTime",SqlDbType.VarChar), new SqlParameter("@DateType",SqlDbType.Int), new SqlParameter("@PtName",SqlDbType.VarChar), new SqlParameter("@PtChartNo",SqlDbType.VarChar), new SqlParameter("@DeptCode",SqlDbType.VarChar), new SqlParameter("@CheckedStatus",SqlDbType.Int) }; // 給存儲過程參數數組賦值 paraValues[0].Value = "2017-06-01"; paraValues[1].Value = "2017-07-01"; paraValues[2].Value = 1; paraValues[3].Value = ""; paraValues[4].Value = ""; paraValues[5].Value = ""; paraValues[6].Value = 1; this.dgv_Demo.DataSource = LoadData(strProcName, paraValues); } ////// 通過存儲過程獲取數據 /// /// 存儲過程名稱 /// 可變的參數數組 數組的個數可以為0,也可以為多個 ///private DataTable LoadData(string strProcName, params object[] paraValues) { DataTable dt = new DataTable(); string strConn = ConfigurationManager.ConnectionStrings["HealthHospInfection"].ConnectionString; using (SqlConnection conn = new SqlConnection(strConn)) { try { SqlCommand cmd = new SqlCommand(); cmd.CommandText = strProcName; // 設置CommandType的類型 cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = conn; conn.Open(); if (paraValues != null) { //添加參數 cmd.Parameters.AddRange(paraValues); } // 取數據 using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { adapter.Fill(dt); } } catch (Exception ex) { MessageBox.Show("錯誤:" + ex.Message + "/r/n跟蹤:" + ex.StackTrace); } finally { conn.Close(); } } return dt; } } }
二、使用SqlCommandBuilder
在上面的例子中,得到一個SqlCommand之后要一個一個地去設置參數,這樣很麻煩,幸好SqlCommandBuilder有一個靜態的方法:
public static void DeriveParameters(SqlCommand command);
使用這個方法有兩個局限性:
- 1、參數必須是SqlCommand。
- 2、該方法只能在調用存儲過程的時候使用。
同時還要注意到:在使用的時候,數據庫連接必須是打開的。
下面的例子演示如何使用這個方法設置存儲過程的參數:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Windows.Forms; namespace ExecuteProcBySQLServer { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void btn_LoadData_Click(object sender, EventArgs e) { // 存儲過程名稱 string strProcName = "usp_yngr_getInfectionCard_test"; // 定義參數類 object objParams = new { BeginTime = "2017-06-01", EndTime = "2017-07-01", DateType = 1, PtName = "", PtChartNo = "", DeptCode = "", CheckedStatus = 1 }; this.dgv_Demo.DataSource = LoadData(strProcName,objParams); } private DataTable LoadData(string strProcName,object objParams) { DataTable dtInit = new DataTable(); string strConn = ConfigurationManager.ConnectionStrings["HealthHospInfection"].ConnectionString; using (SqlConnection conn = new SqlConnection(strConn)) { try { SqlCommand cmd = new SqlCommand(); cmd.CommandText = strProcName; // 設置CommandType的類型 cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = conn; conn.Open(); // 添加參數 foreach (var item in GetParameters(cmd, objParams)) { cmd.Parameters.Add(item); } // 取數據 using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { adapter.Fill(dtInit); } } catch (Exception ex) { MessageBox.Show("錯誤:" + ex.Message + "/r/n跟蹤:" + ex.StackTrace); } finally { conn.Close(); } } return dtInit; } private CollectionGetParameters(SqlCommand command, object objParam) { Collection collection = new Collection (); if (objParam != null) { // 使用反射獲取屬性 PropertyInfo[] properties = objParam.GetType().GetProperties(); SqlCommandBuilder.DeriveParameters(command); //int index = 0; foreach (SqlParameter parameter in command.Parameters) { foreach (PropertyInfo property in properties) { if (("@" + property.Name.ToLower()).Equals(parameter.ParameterName.ToLower())) { parameter.Value = property.GetValue(objParam, null); collection.Add(parameter); } } } // 清空所有參數對象 command.Parameters.Clear(); } return collection; } } }
示例代碼下載地址:點此下載
原文鏈接:https://www.cnblogs.com/dotnet261010/p/7428513.html
相關推薦
- 2022-07-10 詳解transition 被動動畫
- 2023-04-01 Pytorch中關于F.normalize計算理解_python
- 2022-12-13 深入了解Go的HttpClient超時機制_Golang
- 2022-04-11 Android開發中checkBox自定義樣式
- 2023-06-20 Python實用技巧之臨時文件的妙用_python
- 2022-04-19 C#使用CancellationTokenSource?取消?Task的方法_C#教程
- 2023-07-04 springboot引入外部sdk,以及在maven中配置,以及連同sdk打包
- 2022-06-06 SpringBoot、SpringCloud、SpringCloudAlibaba的版本對應關系
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支