}
}
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(
\性别 from person where 性别> 18 \ DataSet dataset = new DataSet(); adapter.Fill(dataset, \
dataGridView1.DataSource = dataset.Tables[\ adapter.Dispose(); }
catch (Exception err) {
MessageBox.Show(err.Message); } finally {
conn.Close(); } }
5、调用存储过程,设计程序完成下列功能:任意给出一个汉字,统计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 习题9_5 {
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 = \ cmd.CommandType = CommandType.StoredProcedure;
} } //添加存储过程中参数需要的初始值,注意参数名要和存储过程定义的参数名相同 if( textBox1.Text==\ {
MessageBox.Show(\请输入有效信息\错误\ textBox1.Focus(); return ; }
cmd.Parameters.AddWithValue(\ cmd.Parameters.AddWithValue(\
//指定哪些参数需要返回结果 cmd.Parameters[\ try {
conn.Open(); //执行存储过程
cmd.ExecuteNonQuery(); //显示返回的结果
MessageBox.Show(string.Format(\有{0}条含 {1} 的记录\ cmd.Parameters[\
} catch (Exception err)
{ MessageBox.Show(err.Message); } finally
{ conn.Close(); }
}
习题 10 参考解答
1、简要说明如何使用CrystalReportViewer和ReportDocument对象模型。 【解答】
使用CrystalReportViewer对象模型,首先在VS2005中创建水晶报表文件.rpt,然后通 过CrystalReportViewer控件将该报表封装到对象模型中,
与报表进行交互。但建议使用CrystalReportViewer控制报表的外观显示形式,不要使用 CrystalReportViewer对象直接与报表交互,
ReportDocument对象模型比CrystalReportViewer功能多、范围广。该对象模型提供了 在代码中处理报表的各种能力。在VS2008中创建水晶报表文件.rpt,完成报表设计后,选 择主菜单中的【生成】【生成解决方案】
型,在工具箱中即可以看到自动生成的与报表同名的组件,将该组件拖放到设计窗体后,即 得到实例,使用该实例的属性完成对报表结构及报表内部数据的各种控制。
2、嵌入式水晶报表和非嵌入式水晶报表有什么相同点和不同点?在Windows应用程序中, 能否使用非嵌入式水晶报表? 【解答】
相同点:都需要创建水晶报表文件.rpt。 不同点:
①嵌入式报表具有与.rpt文件对应的同名包装类,直接通过代码与包装类进行交互,而 不是与原始报表文件本身进行交互。非嵌入式报表则单独以.rpt文件形式存在报表,该报表 不包含在项目内,也没有对应的报表包装类。
②对于嵌入式报表,系统对项目进行编译时,与其他项目资源一样,报表和其包装类都 会被自动嵌入到程序集中,用户看不到被包装后的.rpt文件。对于非嵌入式报表,如果是 ASP.NET网站,要求该.rpt文件保存在网站根目录下,如果是Windows应用程序则要求分 发后.rpt文件保存在和.exe文件相同的目录下。
③对于嵌入式报表,如果修改了报表内容,必须重新编译整个项目。非嵌入式报表修改 了报表内容,不须重新编译整个项目。
在Windows应用程序中,可以使用非嵌入式水晶报表。但要求分发后.rpt文件保存在 和.exe文件相同的目录下(通过Application.StartPath访问该目录) 中,水晶报表.rpt文件的【生成操作】属性改为“无” 【复制到输出目录】属性改为“始终复制”
习题 11 参考解答
1、类库和控件库的主要区别是什么? 【解答】
类库是指独立提供的组件。类库本身不能单独运行,只能被其他程序调用。这里需要说明 一点,之所以称这个.dll文件为类库而不直接叫动态链接库,是因为“动态链接库”这个词 包含的范围太广,不管是.NET之前的组件技术还是基于.NET的组件技术,也不管是组件还 是控件,只要扩展名为.dll的文件都叫动态链接库。为了区分组件和控件,我们才将不带界 面的组件叫“类库”
2、特性(Attribute)和属性(Property)的作用各是什么?举例说明如何利用特性控制属性 窗口中的属性分类。 【解答】
特性实际上是由一个或多个继承自Attribute类的特殊类的简称。从用途上来看,可以将 特性理解为一种标记,该标记用于提供目标元素的信息。目标元素可以是程序集、类、构造 函数、
返回值、结构或其他特性(Attribute)
例如,下面的代码在属性ErrorMessage的上方声明了DefaultValue特性和Description特性。
[DefaultValue(null)]
[Description(\提示信息\验证\ public string ErrorMessage{ get; set; }

