C#数据库工具开发(二)

问题(07/09-/07/11)

1. 数据库连接的开关,需要确认连接状态

为了避免之后执行sql查询等操作时反复连接数据库,我把数据库连接打开和关闭分成两个方法,在登录成功时打开连接,一直到程序结束前断开连接。同时为了避免多次打开同一连接,需要在打开前先确认连接状态。

2. 执行SQL语句是忽略关键字GO

问题发生在使用SQL语句进入特定数据库时。虽然在实际数据库中可以使用,但用C#连接的SQL server不识别GO。
解决方法也很简单,use 数据库名之后不加GO,加;就行。

更好的解决方法:处理批量sql语句

ps:记录一种查询服务器中所有数据库 和 两种查询特定数据库中所有表的SQL语句:
查数据库:Select Name FROM Master.dbo.SysDatabases ORDER BY Name;
查表法一:select name from sysobjects where xtype='U' order by name;
查表法二:SELECT table_name FROM information_schema.tables WHERE table_type = 'base table'
详细1
详细2

3. 存储sql执行语句结果的两种方式

法一用SqlDataAdapter

1
2
3
DataSet ds = new DataSet();
SqlDataAdapter sAdapter = new SqlDataAdapter(sql, sqlConnection);
sAdapter.Fill(ds);

法二用SqlDataReader

SqlDataReader sRead = cmd.ExecuteReader();

这两种方法的主要区别

4. 查询结果如何在主窗口正确显示?

最开始使用的ListView控件,通过添加listviewitem显示字段。具体方法如下:

1
2
3
4
5
ListViewItem li = new ListViewItem();
li.SubItems.Clear();
li.SubItems[0].Text = reader["name"].ToString();
li += new EventHandler(this.dbItem_DoubleClick);
DBList.Items.Add(li);

这种方法问题在于,我想实现点击item(字段)显示对应的表名或表结构,但是很难为item添加事件。

解决措施:
换用DataGridView控件,好处在于:第一,这个控件本来就是为数据库显示服务的,获得DataSet之后用dataView.DataSource = ds.Tables[0].DefaultView;就可以显示完整表单。第二,通过CurrentCellChanged事件就可以很方便实现点击显示对应表单的效果。