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 + "'";
* //取得品名完全相同的產品
*/
}
}





留言
張貼留言