C#調(diào)用SQL?Server中有參數(shù)的存儲(chǔ)過(guò)程
一、使用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)
{
// 存儲(chǔ)過(guò)程名稱
string strProcName = "usp_yngr_getInfectionCard_test";
//定義存儲(chǔ)過(guò)程的參數(shù)數(shù)組
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)
};
// 給存儲(chǔ)過(guò)程參數(shù)數(shù)組賦值
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);
}
/// <summary>
/// 通過(guò)存儲(chǔ)過(guò)程獲取數(shù)據(jù)
/// </summary>
/// <param name="strProcName">存儲(chǔ)過(guò)程名稱</param>
/// <param name="paraValues">可變的參數(shù)數(shù)組 數(shù)組的個(gè)數(shù)可以為0,也可以為多個(gè)</param>
/// <returns></returns>
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;
// 設(shè)置CommandType的類(lèi)型
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
conn.Open();
if (paraValues != null)
{
//添加參數(shù)
cmd.Parameters.AddRange(paraValues);
}
// 取數(shù)據(jù)
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(dt);
}
}
catch (Exception ex)
{
MessageBox.Show("錯(cuò)誤:" + ex.Message + "/r/n跟蹤:" + ex.StackTrace);
}
finally
{
conn.Close();
}
}
return dt;
}
}
}二、使用SqlCommandBuilder
在上面的例子中,得到一個(gè)SqlCommand之后要一個(gè)一個(gè)地去設(shè)置參數(shù),這樣很麻煩,幸好SqlCommandBuilder有一個(gè)靜態(tài)的方法:
public static void DeriveParameters(SqlCommand command);
使用這個(gè)方法有兩個(gè)局限性:
- 1、參數(shù)必須是SqlCommand。
- 2、該方法只能在調(diào)用存儲(chǔ)過(guò)程的時(shí)候使用。
同時(shí)還要注意到:在使用的時(shí)候,數(shù)據(jù)庫(kù)連接必須是打開(kāi)的。
下面的例子演示如何使用這個(gè)方法設(shè)置存儲(chǔ)過(guò)程的參數(shù):
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)
{
// 存儲(chǔ)過(guò)程名稱
string strProcName = "usp_yngr_getInfectionCard_test";
// 定義參數(shù)類(lèi)
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;
// 設(shè)置CommandType的類(lèi)型
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
conn.Open();
// 添加參數(shù)
foreach (var item in GetParameters(cmd, objParams))
{
cmd.Parameters.Add(item);
}
// 取數(shù)據(jù)
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(dtInit);
}
}
catch (Exception ex)
{
MessageBox.Show("錯(cuò)誤:" + ex.Message + "/r/n跟蹤:" + ex.StackTrace);
}
finally
{
conn.Close();
}
}
return dtInit;
}
private Collection<SqlParameter> GetParameters(SqlCommand command, object objParam)
{
Collection<SqlParameter> collection = new Collection<SqlParameter>();
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);
}
}
}
// 清空所有參數(shù)對(duì)象
command.Parameters.Clear();
}
return collection;
}
}
}示例代碼下載地址:點(diǎn)此下載
到此這篇關(guān)于C#調(diào)用SQL Server中有參數(shù)存儲(chǔ)過(guò)程的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SQL Server存儲(chǔ)過(guò)程在C#中調(diào)用的簡(jiǎn)單實(shí)現(xiàn)方法
- C# Ado.net實(shí)現(xiàn)讀取SQLServer數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程列表及參數(shù)信息示例
- C#執(zhí)行存儲(chǔ)過(guò)程并將結(jié)果填充到GridView的方法
- 使用C#代碼獲取存儲(chǔ)過(guò)程返回值
- c#獲取存儲(chǔ)過(guò)程返回值示例分享
- C#獲取存儲(chǔ)過(guò)程返回值和輸出參數(shù)值的方法
- C#中如何執(zhí)行存儲(chǔ)過(guò)程方法
- C#中常用的分頁(yè)存儲(chǔ)過(guò)程小結(jié)
- C#開(kāi)發(fā)Winform程序調(diào)用存儲(chǔ)過(guò)程
相關(guān)文章
Unity屏幕雪花另類(lèi)實(shí)現(xiàn)方式示例
這篇文章主要介紹了Unity屏幕雪花另類(lèi)實(shí)現(xiàn)方式示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
jQuery結(jié)合C#實(shí)現(xiàn)上傳文件的方法
這篇文章主要介紹了jQuery結(jié)合C#實(shí)現(xiàn)上傳文件的方法,涉及C#文件上傳的相關(guān)技巧,需要的朋友可以參考下2015-04-04
WPF使用DrawingContext實(shí)現(xiàn)繪制刻度條
這篇文章主要為大家詳細(xì)介紹了如何利用WPF DrawingContext實(shí)現(xiàn)繪制刻度條,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下2022-09-09
C#實(shí)現(xiàn)Zip壓縮目錄中所有文件的方法
這篇文章主要介紹了C#實(shí)現(xiàn)Zip壓縮目錄中所有文件的方法,涉及C#針對(duì)文件的讀寫(xiě)與zip壓縮相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
C#調(diào)用SQL語(yǔ)句時(shí)乘號(hào)的用法
這篇文章主要介紹了C#調(diào)用SQL語(yǔ)句時(shí)乘號(hào)的用法,可避免因符號(hào)引起的程序錯(cuò)誤,是C#程序設(shè)計(jì)人員有必要掌握的,需要的朋友可以參考下2014-08-08
C#實(shí)體對(duì)象序列化成Json并讓字段的首字母小寫(xiě)的兩種解決方法
這篇文章主要介紹了C#實(shí)體對(duì)象序列化成Json并讓字段的首字母小寫(xiě)的兩種方法,在這兩種方法中小編比較推薦使用第二種方法,需要的朋友可以參考下2018-06-06
C#實(shí)現(xiàn)實(shí)體類(lèi)與字符串互相轉(zhuǎn)換的方法
這篇文章主要介紹了C#實(shí)現(xiàn)實(shí)體類(lèi)與字符串互相轉(zhuǎn)換的方法,涉及C#字符串及對(duì)象的相互轉(zhuǎn)換技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08

