创建窗体程序,要求使用DataGridView控件绑定DataSet的DataTable,要求接收用户输入作为SQL命令
【考点】
DataGridView控件的使用方法。
【出现频率】
★★☆☆☆
【解答】
在VS 2005/VS 2008中创建名为DataSetDb的窗体应用程序项目,其控件布局及命名如图9.8所示。图9.8 DataSetDb项目窗体控件布局及命名
在DataSetDb项目中添加应用程序配置文件,并命名为App.config,编写App.config文件如代码9.4所示。代码9.4 应用程序配置文件:App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="SqlDbStr" connectionString="Data Source = (local)\SQLEXPRESS;Integrated Security = True;Database=MyDb; "/>
</connectionStrings>
</configuration>
本程序窗体刚载入时,程序已经创建了连接对象及SqlConnection对象。不过,连接对象并未打开,所以数据库连接状态的默认值为Closed。编写DataSetDb项目的Form1.cs如代码9.5所示。代码9.5 DataSetDb项目:Form1.cs
using System;
………………………………
//导入必要的命名空间
using System.Configuration;
using System.Data.SqlClient;
namespace DataSetDb
{
public partial class Form1 : Form
{
//声明三个string类型变量,用于存储连接字符串、SQL语句和数据表名称
string ConnStr, SqlStr, tablename;
//声明SqlConnection类型的cn变量
SqlConnection cn;
//声明SqlDataAdapter类型的da变量
SqlDataAdapter da;
//创建DataSet对象,其引用为ds,名称为MyDs
DataSet ds = new DataSet("MyDs");
//声明int类型的变量,用于存储Fill方法的返回值
int RowNum;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//读取App.config文件name属性为“SqlDbStr”的节点的ConnectionString属性值,并赋值给ConnStr变量
ConnStr = ConfigurationManager.ConnectionStrings["SqlDbStr"].ConnectionString;
//创建SqlConnection类型的新对象,在构造函数中传递ConnStr作为连接字符串
cn = new SqlConnection(ConnStr);
//设置DGView控件为只读
this.DGView.ReadOnly = true;
}
private void ExeBtn_Click(object sender, EventArgs e)
{
//赋值空字符串到SqlStr变量
SqlStr = "";
//将SqlStrTxt控件的Text属性值赋值给SqlStr变量
SqlStr = this.SqlStrTxt.Text;
//将myuserinfo赋值给tablename变量
tablename = "myuserinfo";
//调用GetDs方法,并传递SqlStr、tablename和this.DGView
GetDs(SqlStr, tablename, this.DGView);
this.RowNumTxt.Text = this.RowNum.ToString();
}
private void GetDs(string sql, string tablename, DataGridView dgv)
{
try
{
//创建新的SqlDataAdapter对象,并传递SqlStr和cn
//将SqlDataAdapter对象引用赋值给da
da = new SqlDataAdapter(sql, cn);
//将cn的连接状态以字符串形式显示在DbStateTxt控件
this.DbStateTxt.Text = cn.State.ToString();
//判断ds的Tables集合是否有名为tablename的数据表
if (ds.Tables[tablename] != null)
{
//清除指定数据表的数据
ds.Tables[tablename].Clear();
}
//调用da的Fill方法,传递ds和自定义数据表名称
//将Fill方法返回值赋值给RowNum变量
this.RowNum = da.Fill(ds, tablename);
//将cn的连接状态以字符串形式显示在DbStateTxt控件
this.DbStateTxt.Text = cn.State.ToString();
//设置dgv的数据源为ds中名称为tablename的DataTable
dgv.DataSource = ds.Tables[tablename];
}
//捕捉各种异常
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
this.DbStateTxt.Text = cn.State.ToString();
//关闭数据库连接
cn.Close();
}
}
}
}
在程序开始运行后,用户在“SQL语句”文本下面的TextBox控件中输入正确的SQL查询语句,然后单击“执行”按钮,运行效果如图9.9所示。图9.9 用户输入语句的执行结果
用户单击“执行”按钮后,数据库连接状态值一直保持Closed。因为本例采用数据适配器(DataAdapter)对象打开连接对象,获取数据库的数据记录后,马上关闭连接对象。所以在表面上看不到连接状态的变化。
【分析】
本题考查的内容比较简单,只需要使用数据适配器(DataAdapter)查询数据库的数据记录,在这个过程中,SQL查询命令取自于用户的输入值。获取数据后,调用数据适配器(DataAdapter)的Fill方法将其填充至指定的DataSet的DataTable中。最后,根据情况将这个DataTable设置为DataGridView控件的数据源(DataSource),即可满足题目的要求。
将数据填充至指定的DataSet的DataTable前,需要确保当前的DataTable中的数据为空,否则新数据会追加至DataTable中已有的数据表中。本题采用以下代码确保指定数据表内容为空。
if (ds.Tables[tablename] != null)
{
ds.Tables[tablename].Clear();
}
tablename为指定DataTable对象的友好名称,在确保指定名称的DataTable对象存在的情况下,先清空该对象所有的数据。
注意:本例答案中,关闭数据库连接对象和数据库连接状态的显示的代码不是必要的,只是为了测试数据库连接状态是否有变化。
DataGridView控件的使用方法。
【出现频率】
★★☆☆☆
【解答】
在VS 2005/VS 2008中创建名为DataSetDb的窗体应用程序项目,其控件布局及命名如图9.8所示。图9.8 DataSetDb项目窗体控件布局及命名
在DataSetDb项目中添加应用程序配置文件,并命名为App.config,编写App.config文件如代码9.4所示。代码9.4 应用程序配置文件:App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="SqlDbStr" connectionString="Data Source = (local)\SQLEXPRESS;Integrated Security = True;Database=MyDb; "/>
</connectionStrings>
</configuration>
本程序窗体刚载入时,程序已经创建了连接对象及SqlConnection对象。不过,连接对象并未打开,所以数据库连接状态的默认值为Closed。编写DataSetDb项目的Form1.cs如代码9.5所示。代码9.5 DataSetDb项目:Form1.cs
using System;
………………………………
//导入必要的命名空间
using System.Configuration;
using System.Data.SqlClient;
namespace DataSetDb
{
public partial class Form1 : Form
{
//声明三个string类型变量,用于存储连接字符串、SQL语句和数据表名称
string ConnStr, SqlStr, tablename;
//声明SqlConnection类型的cn变量
SqlConnection cn;
//声明SqlDataAdapter类型的da变量
SqlDataAdapter da;
//创建DataSet对象,其引用为ds,名称为MyDs
DataSet ds = new DataSet("MyDs");
//声明int类型的变量,用于存储Fill方法的返回值
int RowNum;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//读取App.config文件name属性为“SqlDbStr”的节点的ConnectionString属性值,并赋值给ConnStr变量
ConnStr = ConfigurationManager.ConnectionStrings["SqlDbStr"].ConnectionString;
//创建SqlConnection类型的新对象,在构造函数中传递ConnStr作为连接字符串
cn = new SqlConnection(ConnStr);
//设置DGView控件为只读
this.DGView.ReadOnly = true;
}
private void ExeBtn_Click(object sender, EventArgs e)
{
//赋值空字符串到SqlStr变量
SqlStr = "";
//将SqlStrTxt控件的Text属性值赋值给SqlStr变量
SqlStr = this.SqlStrTxt.Text;
//将myuserinfo赋值给tablename变量
tablename = "myuserinfo";
//调用GetDs方法,并传递SqlStr、tablename和this.DGView
GetDs(SqlStr, tablename, this.DGView);
this.RowNumTxt.Text = this.RowNum.ToString();
}
private void GetDs(string sql, string tablename, DataGridView dgv)
{
try
{
//创建新的SqlDataAdapter对象,并传递SqlStr和cn
//将SqlDataAdapter对象引用赋值给da
da = new SqlDataAdapter(sql, cn);
//将cn的连接状态以字符串形式显示在DbStateTxt控件
this.DbStateTxt.Text = cn.State.ToString();
//判断ds的Tables集合是否有名为tablename的数据表
if (ds.Tables[tablename] != null)
{
//清除指定数据表的数据
ds.Tables[tablename].Clear();
}
//调用da的Fill方法,传递ds和自定义数据表名称
//将Fill方法返回值赋值给RowNum变量
this.RowNum = da.Fill(ds, tablename);
//将cn的连接状态以字符串形式显示在DbStateTxt控件
this.DbStateTxt.Text = cn.State.ToString();
//设置dgv的数据源为ds中名称为tablename的DataTable
dgv.DataSource = ds.Tables[tablename];
}
//捕捉各种异常
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
this.DbStateTxt.Text = cn.State.ToString();
//关闭数据库连接
cn.Close();
}
}
}
}
在程序开始运行后,用户在“SQL语句”文本下面的TextBox控件中输入正确的SQL查询语句,然后单击“执行”按钮,运行效果如图9.9所示。图9.9 用户输入语句的执行结果
用户单击“执行”按钮后,数据库连接状态值一直保持Closed。因为本例采用数据适配器(DataAdapter)对象打开连接对象,获取数据库的数据记录后,马上关闭连接对象。所以在表面上看不到连接状态的变化。
【分析】
本题考查的内容比较简单,只需要使用数据适配器(DataAdapter)查询数据库的数据记录,在这个过程中,SQL查询命令取自于用户的输入值。获取数据后,调用数据适配器(DataAdapter)的Fill方法将其填充至指定的DataSet的DataTable中。最后,根据情况将这个DataTable设置为DataGridView控件的数据源(DataSource),即可满足题目的要求。
将数据填充至指定的DataSet的DataTable前,需要确保当前的DataTable中的数据为空,否则新数据会追加至DataTable中已有的数据表中。本题采用以下代码确保指定数据表内容为空。
if (ds.Tables[tablename] != null)
{
ds.Tables[tablename].Clear();
}
tablename为指定DataTable对象的友好名称,在确保指定名称的DataTable对象存在的情况下,先清空该对象所有的数据。
注意:本例答案中,关闭数据库连接对象和数据库连接状态的显示的代码不是必要的,只是为了测试数据库连接状态是否有变化。
浙公网安备 33010602011771号