C# 高階語法 —— Winfrom鏈接SQL數據庫的存儲過程

存儲過程在應用程序端的使用的優點

????????1 如果sql語句直接寫在客戶端,以一個字符串的形式體現的,提示不友好,會導致效率降低
????????2 sql語句寫在客戶端,可以利用sql注入進行攻擊,為了安全性,可以把sql封裝在服務器存儲過程,在客戶端進行

SQL自定義無參數存儲過程:

創建存儲過程 usp_ScoreQuery1
-- 查詢考試成績,顯示:學號、姓名、班級、總成績,并按成績的總分高低排序。
-- 統計分析考試成績,顯示班級名稱、C#平均分、數據庫平均分,按照班級分組實現。

 use SMDBgoif exists (select * from sysobjects where name = 'usp_ScoreQuery1')drop procedure usp_ScoreQuery1gocreate procedure usp_ScoreQuery1as-- 查詢考試成績select Students.StudentId,StudentName,ClassName, ScoreSum = (CSharp + SqlserverDB) from Studentsinner join StudentClass on StudentClass.ClassId = Students.ClassIdinner join ScoreList on ScoreList.StudentId = Students.StudentIdorder by ScoreSum DESC-- 分析考試信息select ClassName,C#Avg=AVG(CSharp),DBAvg=AVG(SqlserverDB) from ScoreListinner join Students on Students.StudentId = ScoreList.StudentIdinner join StudentClass on StudentClass.ClassId = Students.ClassIdgroup by ClassNameorder by ClassNamego

針對上面實現的效果,繼續修改,改為參數可以帶默認值?

use SMDB
go
if exists (select * from sysobjects where name = 'usp_ScoreQuery4')
drop procedure usp_ScoreQuery4
go
create procedure usp_ScoreQuery4-- 帶默認值@CSharp int = 60,@SqlserverDB int = 60
asselect Students.StudentId,StudentName,CSharp as C#,SqlserverDB as DB from ScoreListinner join Students on Students.StudentId = ScoreList.StudentIdwhere CSharp < @CSharp or SqlserverDB < @SqlserverDB
go-- 調用參數帶默認值的存儲過程
use SMDB
go
exec usp_ScoreQuery4 -- 兩個都走的默認值
exec usp_ScoreQuery4 70,80 -- 第二個參數取默認值
exec usp_ScoreQuery4 @SqlserverDB = 70 -- 第一個參數取默認值
exec usp_ScoreQuery4 default,70 -- 第一個參數取默認值(同上)

3. 自定義帶輸出參數的存儲過程
-- 問題:查詢考試成績,要求自定義分數線,顯示查詢列表,并輸出缺考總人數、不及格總人數?

use SMDB
go
if exists (select * from sysobjects where name = 'usp_ScoreQuery5')
drop procedure usp_ScoreQuery5
go
create procedure usp_ScoreQuery5-- 輸出參數(習慣:輸出參數放在輸入參數的前面)@AbsentCount int output, -- 缺考總人數@FailCount int output, -- 不及格總人數-- 輸入參數@CSharp int = 60, -- CSharp分數線@SqlserverDB int = 60 -- SqlserverDB分數線
as-- 查詢考試成績,要求自定義分數線select Students.StudentId,StudentName,CSharp as C#,SqlserverDB as DB from ScoreListinner join Students on Students.StudentId = ScoreList.StudentIdwhere CSharp < @CSharp or SqlserverDB < @SqlserverDB-- 缺考總人數select @AbsentCount = count(*) from Students where StudentId not in (select StudentId from ScoreList)-- 不及格總人數select @FailCount = count(*) from ScoreList where CSharp < @CSharp or SqlserverDB < @SqlserverDB
go-- 調用參數帶默認值的存儲過程
use SMDB
go
-- 首先定義輸出參數(命名可以和上面的保持一致,不一樣也行)
declare @AbsentCount int, @FailCount int
-- 調用存儲過程時,輸出參數后面也必須加上 output 關鍵字
exec usp_ScoreQuery5 @AbsentCount output,@FailCount output 
select @AbsentCount as 缺考總人數,@FailCount as 不及格總人數
-- 打印一下結果
print @AbsentCount
print @FailCount

鏈接SQL數據庫

public string connString = @"Server=.;DataBase=SMDB;Uid=sa;Pwd=123456";

?搭建Winfrom窗體?

一:無參數的存儲過程的調用?

? 不帶參數存儲過程的使用?

????????1指定存儲過程名稱
????????string proceName = "usp_ScoreQuery5";
????????2創建指令對象傳遞連接對象和存儲過程
????????SqlCommand cmd = new SqlCommand(proceName,conn);
????????3 指定指令執行類型
????????cmd.CommandType = CommandType.StoredProcedure;
????????4 執行指令
????????SqlDataReader dr = cmd.ExecuteReader();

 private void button1_Click(object sender, EventArgs e){//1 定義存儲過程名稱string proceName = "usp_ScoreQuery1";//2 創建一個指令對象SqlCommand cmd = new SqlCommand();//3 添加執行sql語句和設置連接對象cmd.CommandText = proceName;// 添加執行的sqlcmd.Connection = conn; //設置連接對象//4 執行命令類型cmd.CommandType = System.Data.CommandType.StoredProcedure;// 5 取出數據List<Model1> model1s = new List<Model1>();// 存儲第一個表的數據List<Model2> models2 = new List<Model2>();//存儲第二個表的數據try{SqlDataReader dr = cmd.ExecuteReader(); // 讀取數據庫數據while (dr.Read()){model1s.Add(new Model1() { StudentId =Convert.ToInt32( dr["StudentId"]),StudentName = dr["StudentName"].ToString(),ClassName = dr["ClassName"].ToString(),ScoreNum = Convert.ToInt32(dr["ScoreSum"])});}//如果有第二個數據源 讀取第二個selectif (dr.NextResult()){while (dr.Read()){models2.Add(new Model2() {ClassName = dr["ClassName"].ToString(),CSharpAvg = Convert.ToInt32(dr["C#Avg"]),DBAvg   = Convert.ToInt32(dr["DBAvg"]),});}}dr.Close();this.dataGridView1.DataSource = model1s;this.dataGridView2.DataSource = models2;}catch{throw;}}
二:帶輸入參數的存儲過程的使用

帶輸入參數的存儲過程的調用

????????1指定存儲過程名稱
????????????????string proceName = "usp_ScoreQuery5";
????????2創建指令對象傳遞連接對象和存儲過程
? ? ? ? ????????SqlCommand cmd = new SqlCommand(proceName,conn);
????????3 指定指令執行類型
????????????????cmd.CommandType = CommandType.StoredProcedure;
????????4 添加輸入參數
????????????????cmd.Parameters.Add(new SqlParameter()
? ? ? ? ? ? ????????{
? ? ? ? ? ? ? ????????? ParameterName = "@CSharp",
? ? ? ? ? ? ? ? ????????Direction = ParameterDirection.Input,
? ? ? ? ? ? ? ? ????????SqlDbType = SqlDbType.Int,
? ? ? ? ? ? ? ? ????????Value = 80
? ? ? ? ? ? ????????});
????????5執行指令
????????????????SqlDataReader dr = cmd.ExecuteReader();

private void button2_Click(object sender, EventArgs e)
{//1 指明存儲過程string proceName = "usp_ScoreQuery4";//2 創建指令對象SqlCommand cmd = new SqlCommand();//3 設置連接和設置執行過程cmd.Connection = conn; cmd.CommandText = proceName;//4  執行類型cmd.CommandType = CommandType.StoredProcedure;//5 設置輸入參數//定義參數方法1SqlParameter csharp = new SqlParameter();csharp.ParameterName = "@CSharp";// 設置csharp是存儲過程中對應@CSharp輸入參數csharp.Direction = ParameterDirection.Input;//設置為輸入參數csharp.Value = 180;// 設置參數的值為70csharp.SqlDbType = SqlDbType.Int; //設置參數類型cmd.Parameters.Add(csharp); // 把輸入參數添加到參數列表里面// 定義參數方法2 @SqlserverDBcmd.Parameters.Add(new SqlParameter() { ParameterName = "@SqlserverDB",Direction = ParameterDirection.Input,Value = 180,SqlDbType = SqlDbType.Int,});// 6 獲取數據List<Model3> list = new List<Model3>();try{SqlDataReader dr = cmd.ExecuteReader();while (dr.Read()){list.Add(new Model3(){StudentId = Convert.ToInt32(dr["StudentId"]),StudentName = dr["StudentName"].ToString(),CSharp = Convert.ToInt32(dr["C#"]),DB = Convert.ToInt32(dr["DB"]),});}dr.Close();this.dataGridView1.DataSource = list;}catch{throw;}
}
三:調用帶輸出參數的存儲過程 對應的是model3對象

帶輸入參數帶輸出參數的調用

添加輸出參數即可
??? ?cmd.Parameters.Add(new SqlParameter()
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ParameterName = "@AbsentCount",
? ? ? ? ? ? ? ? Direction = ParameterDirection.Output,
? ? ? ? ? ? ? ? SqlDbType = SqlDbType.Int,
? ? ? ? ? ? });
???獲取輸出參數的值
??? ? ? cmd.Parameters["@AbsentCount"].Value.ToString()

private void button3_Click(object sender, EventArgs e)
{string proceName = "usp_ScoreQuery5";SqlCommand cmd = new SqlCommand(proceName,conn);//cmd.CommandText = proceName;//cmd.Connection = conn;cmd.CommandType = CommandType.StoredProcedure;//設置輸出參數cmd.Parameters.Add(new SqlParameter() { ParameterName= "@AbsentCount",Direction = ParameterDirection.Output,SqlDbType=SqlDbType.Int,});cmd.Parameters.Add(new SqlParameter(){ParameterName = "@FailCount",Direction = ParameterDirection.Output,SqlDbType = SqlDbType.Int,});//輸入參數cmd.Parameters.Add(new SqlParameter(){ParameterName = "@CSharp",Direction = ParameterDirection.Input,SqlDbType = SqlDbType.Int,Value = 80});cmd.Parameters.Add(new SqlParameter(){ParameterName = "@SqlserverDB",Direction = ParameterDirection.Input,SqlDbType = SqlDbType.Int,Value = 80});//取數據List<Model3> list = new List<Model3>();SqlDataReader dr = cmd.ExecuteReader();while (dr.Read()){list.Add(new Model3(){StudentId = Convert.ToInt32(dr["StudentId"]),StudentName = dr["StudentName"].ToString(),CSharp = Convert.ToInt32(dr["C#"]),DB = Convert.ToInt32(dr["DB"]),});}dr.Close();this.dataGridView1.DataSource = list;//輸出參數的值怎么取? 缺考總人數? 不及格人數?this.label1.Text = "缺考總人數:" + cmd.Parameters["@AbsentCount"].Value.ToString() + "人";this.label2.Text = "不及格總人數:" + cmd.Parameters["@FailCount"].Value.ToString() + "人";
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/710983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嘉立創專業版導入SW模型的板框

1、SW新建一個需要的模型&#xff0c;例如下圖&#xff0c; 2、點擊另存為.dxf 文件&#xff08;是.dxf文件&#xff09; 3、選擇要保存模型的視圖&#xff0c;如上視圖&#xff0c;確定后出現上視圖板框形狀&#xff0c;然后保存即可。 4、打開嘉立創&#xff0c;點擊文件——…

Linux中的awk命令

AWK是一種在Linux系統中經常使用的文本處理工具&#xff0c;它可以根據指定的模式對文本文件進行處理和分析。下面是一些關于AWK命令的使用說明和舉例&#xff1a; 1. 基本語法&#xff1a; awk pattern { action } file 2. 使用字段分隔符&#xff1a; 默認情況下&#xf…

整數編碼【華為OD機試-JAVAPythonC++JS】

題目描述 實現一種整數編碼方法&#xff0c;使得待編碼的數字越小&#xff0c;編碼后所占用的字節數越小。 編碼規則如下: 編碼時7位一組&#xff0c;每個字節的低7位用于存儲待編碼數字的補碼 字節的最高位表示后續是否還有字節&#xff0c;置1表示后面還有更多的字節&#xf…

pytorch -- GPU優化寫法套路

1. GPU優化的點 網絡模型 數據&#xff08;輸入、標注) 損失函數 .cuda方式 代碼&#xff1a; import torch.optim import torchvision from torch import nn from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter# 1. 準備數據集 t…

C++實現XOR加解器

#include <Windows.h> #include <iostream> #include <fstream> #include <string>// 加解密函數&#xff0c;使用XOR運算 void XORCrypt(char* data, int size, const std::string& key) {int keyLength key.length();for (int i 0; i < siz…

日志系統項目實現

日志系統的功能也就是將一條消息格式化后寫入到指定位置&#xff0c;這個指定位置一般是文件&#xff0c;顯示器&#xff0c;支持拓展到數據庫和服務器&#xff0c;后面我們就知道如何實現拓展的了&#xff0c;支持不同的寫入方式(同步異步)&#xff0c;同步:業務線程自己寫到文…

萬卡集群:字節搭建12288塊GPU的單一集群

文章目錄 論文Reference 論文 MegaScale: Scaling Large Language Model Training to More Than 10,000 GPUs 論文鏈接&#xff1a;https://arxiv.org/abs/2402.15627 從結構上講&#xff0c;網絡是基于Clos的“胖樹”結構。其中一個改進是在頂層交換機上把上行與下行鏈路分開&…

三、《任務列表案例》前端程序搭建和運行

本章概要 整合案例介紹和接口分析 案例功能預覽接口分析 前端工程導入 前端環境搭建導入前端程序 啟動測試 3.1 整合案例介紹和接口分析 3.1.1 案例功能預覽 3.1.2 接口分析 學習計劃分頁查詢 /* 需求說明查詢全部數據頁數據 請求urischedule/{pageSize}/{currentPage} 請…

stm32觸發硬件錯誤位置定位

1.背景 1. 項目中&#xff0c;調試過程或者測試中都會出現程序跑飛問題&#xff0c;這個時候問題特別難查找。 2. 觸發硬件錯誤往往是因為內存錯誤。這種問題特別難查找&#xff0c;尤其是產品到了測試階段&#xff0c;而這個異常復現又比較難的情況下&#xff0c;簡直頭疼。…

初學JavaScript總結

0 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是網頁是死的&#xff0c;需要給他注入靈魂&#xff0c;所以接下來需要學習JavaScript&#xff0c;這門語言會讓頁面能夠和用戶進行交互。JavaScript又稱為腳本語言&#xff0c;可以通過腳本實現用戶和頁面的…

每日shell腳本之打印99乘法表

每日shell腳本之打印99乘法表 #!/bin/bash for i in $(seq 1 9); dofor j in $(seq 1 9); doecho -n "$i * $j $(($i * $j)) "doneecho done

Programming Abstractions in C閱讀筆記:p306-p307

《Programming Abstractions in C》學習第75天&#xff0c;p306-p307總結&#xff0c;總計2頁。 一、技術總結 1.Quicksort algorithm(快速排序) 由法國計算機科學家C.A.R(Charles Antony Richard) Hoare&#xff08;東尼.霍爾&#xff09;在1959年開發(develop), 1961年發表…

Mac 制作可引導安裝器

Mac 使用U盤或移動固態硬盤制作可引導安裝器&#xff08;以 Monterey 為例&#xff09; 本教程參考 Apple 官網相關教程 創建可引導 Mac OS 安裝器 重新安裝 Mac OS 相關名詞解釋 磁盤分區會將其劃分為多個單獨的部分&#xff0c;稱為分區。分區也稱為容器&#xff0c;不同容器…

VR虛擬現實技術應用到豬抗原體檢測的好處

利用VR虛擬仿真技術開展豬瘟檢測實驗教學確保生豬產業健康發展 為了有效提高豬場豬瘟防控意識和檢測技術&#xff0c;避免生豬養殖業遭受豬瘟危害&#xff0c;基于VR虛擬仿真技術開展豬瘟檢測實驗教學數據能大大推動基層畜牧養殖業持續穩步發展保駕護航。 一、提高實驗效率 VR虛…

鯤鵬arm64架構下安裝KubeSphere

鯤鵬arm64架構下安裝KubeSphere 官方參考文檔: https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s/ 在Kubernetes基礎上最小化安裝 KubeSphere 前提條件 官方參考文檔: https://kubesphere.io/zh/docs/installing-on-kubernetes/introduction/prerequi…

基于大模型思維鏈(Chain-of-Thought)技術的定制化思維鏈提示和定向刺激提示的心理咨詢場景定向ai智能應用

本篇為個人筆記 記錄基于大模型思維鏈&#xff08;Chain-of-Thought&#xff09;技術的定制化思維鏈提示和定向刺激提示的心理咨詢場景定向ai智能應用 人工智能為個人興趣領域 業余研究 如有錯漏歡迎指出&#xff01;&#xff01;&#xff01; 目錄 本篇為個人筆記 記錄基…

價格腰斬,騰訊云2024優惠活動云服務器62元一年,多配置報價

騰訊云服務器多少錢一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;騰訊云2核4G5M輕量應用服務器218元一年、756元3年&#xff0c;4核16G12M服務器32元1個月、312元一年&#xff0c;8核32G22M服務器115元1個月、345元3個月&#xff0c;騰訊云服務器網txyfwq.co…

Node.js中的并發和多線程處理

在Node.js中&#xff0c;處理并發和多線程是一個非常重要的話題。由于Node.js是單線程的&#xff0c;這意味著它在任何給定時間內只能執行一個任務。然而&#xff0c;Node.js的事件驅動和非阻塞I/O模型使得處理并發和多線程變得更加高效和簡單。在本文中&#xff0c;我們將探討…

【排坑】搭建 Karmada 環境

git clone 報錯 問題&#xff1a;Failed to connect to github.com port 443:connection timed out 解決&#xff1a; git config --global --unset http.proxy【hack/local-up-karmada.sh】 1. karmada ca-certificates (no such package) 問題&#xff1a;fetching http…

老化的電動車與高層電梯樓的結合,將是巨大的安全隱患

中國是全球最大的電動汽車市場&#xff0c;其實中國還是全球最大的電動兩輪車市場&#xff0c;而電動兩輪車的老化比電動汽車更快&#xff0c;電動汽車的電池壽命可以達到10年&#xff0c;而電動兩輪車的電池壽命只有3-5年&#xff0c;而首批電動兩輪車至今已老化得相當嚴重&am…