C# 調用SQLServer的預存程序
目的:
在C#中輸入條件導入SQLServr的預存程序
再取得預存程序的結果輸出至C#程式中
這很重要,沒選練練直接查詢,會把預存程序放在master資料庫
在C#中輸入條件導入SQLServr的預存程序
再取得預存程序的結果輸出至C#程式中
使用者輸入範圍,取得該範圍內總和、平均、及個數
按查詢全表,會取得全部的內容
取得全表後,可以進行金額由大到小的排序
輸入"肉",取得品名中有"肉"的產品
說明:
先說為什麼要用StoredProcedure?
StoredProcedure的方法,也可以在程式中寫出
主要目的為了降低藕合,加快執行速度
當需要某些修改時,只要去修訂StoredProcedure就好了
不需要再修訂程式
比喻就是:
到麥當勞時,單點一個大麥克、一個中薯、一個可樂
還是直接說我要「1號餐」,那個比較快?
用程式去撈出完整且單純的資料後,再用力撰寫方法
還是條件給資料庫,直接說要這樣的結果,那個比較快?
相信應該很容易分辦。
程式碼:
先開啟SQLServer,選取「練練」資料庫後新增查詢:
這很重要,沒選練練直接查詢,會把預存程序放在master資料庫
CREATE PROCEDURE 巨巨產品 @price1 MONEY,@price2 MONEY ,@sum MONEY OUTPUT,@avg MONEY OUTPUT AS DECLARE @count INT SELECT @sum=SUM(價錢),@avg=AVG(價錢) FROM 巨巨 WHERE 價錢 BETWEEN @price1 AND @price2 SELECT 產品編號,品名,價錢 FROM 巨巨 WHERE 價錢 BETWEEN @price1 AND @price2 SET @count=@@ROWCOUNT RETURN @count GO
主程式碼:
public partial class Form1 : Form { private DataView vv; //用DataView來做展示的Source //取得資料庫的資料後 //盡量不要用資料庫進行 //排序或篩選等行為 //減輕資料庫的負擔 public Form1() { InitializeComponent(); } //-------------------------------------------------------------------------------------- private void button1_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection("server=localhost;database=練練;UID=SQLAdmin;PWD=1234;"); SqlCommand cmd = new SqlCommand(); cmd.CommandText = "巨巨產品"; cmd.Connection = conn; cmd.CommandType = CommandType.StoredProcedure; //指定要做StoredProcedure型態 //換句話說,我要用"巨巨產品"這個StoredProcedure cmd.Parameters.Add("@price1",SqlDbType.Money).Value = textBox1.Text; cmd.Parameters.Add("@price2", SqlDbType.Money).Value = textBox2.Text; cmd.Parameters.Add("@sum", SqlDbType.Money); cmd.Parameters.Add("@avg", SqlDbType.Money); cmd.Parameters.Add("@count", SqlDbType.Int); /*說明: * 1.預存程序"巨巨產品"中有 @price1,@price2,@sum,@avg,@count這5個參數 * 2.@price1,@price2 的值,是由程式中使用者輸入後取得 * 3.@sum,@avg,@count 的值,是由預存程序計算後,回傳的值 */ cmd.Parameters["@sum"].Direction = ParameterDirection.Output; cmd.Parameters["@avg"].Direction = ParameterDirection.Output; cmd.Parameters["@count"].Direction = ParameterDirection.ReturnValue; /*說明: * 1.設定參數 @sum,@avg,這2個的「方向」為輸出 * 2.設定參數 @count 的「方向」為單純取值 */ conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); dt.DefaultView.Sort = "價錢 ASC,產品編號 ASC"; //設定預設排序為價錢由小到大,若價錢相同產品編號由小到大 double aa = Convert.ToDouble(cmd.Parameters["@sum"].Value); double bb = Convert.ToDouble(cmd.Parameters["@avg"].Value); int count = (int)cmd.Parameters["@count"].Value; //取值 reader.Close(); cmd.Dispose(); conn.Close(); label5.Text = aa.ToString(); label6.Text = bb.ToString(); label7.Text = count.ToString(); dataGridView1.DataSource = dt; //秀出到程式 } //-------------------------------------------------------------------------------------- private void button2_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection("server=localhost;database=練練;UID=SQLAdmin;PWD=1234;"); SqlCommand cmd = new SqlCommand(); cmd.CommandText = "SELECT * FROM 巨巨"; cmd.Connection = con; cmd.CommandType = CommandType.Text; con.Open(); SqlDataReader reader = cmd.ExecuteReader(); DataTable dt = new DataTable(); dt.Load(reader); reader.Close(); cmd.Dispose(); con.Close(); //利用DataTable產生DataView物件 vv = dt.DefaultView; dataGridView1.DataSource = vv; } //-------------------------------------------------------------------------------------- private void button3_Click(object sender, EventArgs e) { //必須先做button2_Click後取得全表,如此DataView vv才會有東西 vv.Sort = "價錢 DESC,品名 ASC"; } //-------------------------------------------------------------------------------------- private void button4_Click(object sender, EventArgs e) { //必須先做button2_Click後取得全表 vv.RowFilter = "品名 LIKE '%"+textBox3.Text+"%'"; /*RowFilter就像資料庫中的WHERE,也就是條件: * * vv.RowFilter = "價錢 >=10 AND 價錢<=20"; * //取得價錢在10~20之間的產品 * * vv.RowFilter = "品名='" + textBox3.Text + "'"; * //取得品名完全相同的產品 */ } }
留言
張貼留言