创建窗体程序,要求使用DataGridView控件绑定DataSet的DataTable,要求接收用户输入作为SQL命令

创建窗体程序,要求使用DataGridView控件绑定DataSet的DataTable,要求接收用户输入作为SQL命令  

2009-07-30 12:08:13|  分类: 面试相关 |  标签: |字号 订阅

【考点】
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对象存在的情况下,先清空该对象所有的数据。
注意:本例答案中,关闭数据库连接对象和数据库连接状态的显示的代码不是必要的,只是为了测试数据库连接状态是否有变化。
posted @ 2011-10-07 13:28  peterlee  阅读(934)  评论(0)    收藏  举报