1. 使用保持連接的方式編寫程序,計算各年級平均成績,並顯示結果。
【解答】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClIEnt;
namespace 習題8_6_1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//添加Button按鈕在ListBox中顯示結果
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Add("年級 平均成績");
string connectionString = PropertIEs.Settings.Default.MyDatabaseConnectionString;
//根據連接字符串創建SqlConnection實例
SqlConnection conn = new SqlConnection(connectionString);
//創建SqlCommand實例,並設置SQL語句和使用的連接實例
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select substring(學號,1,2) as 年級,avg(成績) as 平均成績 from MyTable2 group by substring(學號,1,2)";
cmd.Connection = conn;
try
{
conn.Open();
SqlDataReader r = cmd.ExecuteReader();
while (r.Read() == true)
{
listBox1.Items.Add(string.Format("{0}級 {1}", r[0], r[1]));
}
r.Close();
}
catch (Exception err)
{
MessageBox.Show(err.Message, "計算成績失敗");
}
finally
{
conn.Close();
}
}
}
}
2. 使用保持連接的方式編寫程序,查詢MyTable2中不及格學生的學號,姓名,性別,成績。並將結果在ListBox中顯示出來。
【解答】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClIEnt;
namespace 習題8_6_2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
listBox1.Items.Add(" 學號 姓名 性別 成績");
string connectionString = PropertIEs.Settings.Default.MyDatabaseConnectionString;
//根據連接字符串創建SqlConnection實例
SqlConnection conn = new SqlConnection(connectionString);
//創建SqlCommand實例,並設置SQL語句和使用的連接實例
SqlCommand cmd = new SqlCommand();
cmd.CommandText =
"Select 學號,姓名,性別, 成績 From MyTable2 Where (成績<60)";
cmd.Connection = conn;
try
{
conn.Open();
SqlDataReader r = cmd.ExecuteReader();
while (r.Read() == true)
{
listBox1.Items.Add( string.Format("{0} {1} {2} {3}", r[0], r[1], r[2], r[3]));
}
r.Close();
}
catch (Exception err)
{
MessageBox.Show(err.Message, "查詢成績失敗");
}
finally
{
conn.Close();
}
}
}
}
3. 編寫程序,以“[編碼]名稱”的樣式在comboBox1中顯示MyTable1的內容。
【解答】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClIEnt;
namespace 習題8_6_3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string connectionString = PropertIEs.Settings.Default.MyDatabaseConnectionString;
//根據連接字符串創建SqlConnection實例
SqlConnection conn = new SqlConnection(connectionString);
//創建SqlCommand實例,並設置SQL語句和使用的連接實例
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Select * From MyTable1";
cmd.Connection = conn;
try
{
conn.Open();
SqlDataReader r = cmd.ExecuteReader();
while (r.Read() == true)
{
comboBox1.Items.Add(string.Format("[{0}] {1}", r[0], r[1]));
}
comboBox1.SelectedIndex = 0;
r.Close();
}
catch (Exception err)
{
MessageBox.Show(err.Message, "顯示數據失敗");
}
finally
{
conn.Close();
}
}
}
}
4. 在畫線處填上合適的內容,使程序變得正確完整。
string connString="server=localhost;Integrated Security=SSPI;database=pubs";
SqlConnection conn=____________________________
string strsql="select * from MyTable2";
SqlDataAdapter adapter=new SqlDataAdapter(_____________);
dataset=new DataSet();
adapter.Fill(________________,"MyTable2");
this.dataGridVIEw1.DataSource=dataset.Tables["MyTable2"];
【解答】
string connString="server=localhost;Integrated Security=SSPI;database=pubs";
SqlConnection conn= new SqlConnection(PropertIEs.Settings.Default.MyDatabaseConnectionString);
string strsql="select * from MyTable2";
SqlDataAdapter adapter=new SqlDataAdapter(conn);
dataset=new DataSet();
adapter.Fill(dataset,"MyTable2");
this.dataGridVIEw1.DataSource=dataset.Tables["MyTable2"];
5. 已知數據庫中定義了一張person表,表的數據結構如下:
字段名稱字段類型字段含義
id數字編號
xm文本姓名
xb文本性別
nl數字年齡
zip文本郵政編碼
用編寫代碼的方法在DataGridVIEw中顯示該數據表中年齡大於18的所有紀錄,顯示時以編號的升序排序,要求禁止用戶編輯數據。
【解答】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClIEnt;
namespace 習題8_6_5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string connectionstring = PropertIEs.Settings.Default.MyDatabaseConnectionString ;
SqlConnection conn = new SqlConnection(connectionstring);
try
{
conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter(
"select id,xm,xb,nl from person where nl > 18 order by id", conn);
DataSet dataset = new DataSet();
//如果不指定表名,則系統自動生成一個默認的表名
adapter.Fill(dataset, "person");
//可以使用索引引用生成的表
dataGridVIEw1.DataSource = dataset.Tables["person"];
adapter.Dispose();
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
finally
{
conn.Close();
}
}
private void Form1_Load(object sender, EventArgs e)
{
//不允許用戶直接在最下面的行添加新行
dataGridVIEw1.AllowUserToAddRows = false;
//不允許用戶直接按Delete鍵刪除行
dataGridVIEw1.AllowUserToDeleteRows = false;
}
}
}
6.例8-18的存儲過程定義中,將“@surname nvarchar(2),”改為“@surname nchar(2),”,是否仍然能夠得到正確結果,為什麼?
【解答】
不一定。因為如果傳遞的參數值為“王”,在存儲過程中會自動變為“王 ”。
7. 調用存儲過程,設計程序完成下列功能:任意給出一個漢字,統計MyTable2中所有包含該漢字的人數,並顯示統計結果。
【解答】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClIEnt;
namespace 習題8_6_7
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SqlConnection conn =
new SqlConnection(PropertIEs.Settings.Default.MyDatabaseConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
//設置SQL語句為存儲過程名,命令類型為存儲過程
cmd.CommandText = "SelectFilterStudentsNum";
cmd.CommandType = CommandType.StoredProcedure;
//添加存儲過程中參數需要的初始值,注意參數名要和存儲過程定義的參數名相同
if( textBox1.Text=="")
{
MessageBox.Show("請輸入有效信息","錯誤");
textBox1.Focus();
return ;
}
cmd.Parameters.AddWithValue("@surname", textBox1.Text);
cmd.Parameters.AddWithValue("@record", 0);
//指定哪些參數需要返回結果
cmd.Parameters["@record"].Direction = ParameterDirection.Output;
try
{
conn.Open();
//執行存儲過程
cmd.ExecuteNonQuery();
//顯示返回的結果
MessageBox.Show(string.Format("有{0}條含 {1} 的記錄",
cmd.Parameters["@record"].Value,textBox1.Text));
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
finally
{
conn.Close();
}
}
}
}