DataWindow.net应用介绍(一)
Datawindow中文译名为数据窗口,是开发工具PowerBuilder(PB)的一个王牌组件,使用PB作为开发工具的,基本上都是冲着Datawindow 来的,它不仅可以用来显示数据,还可以实现数据录入、报表打印等功能,是Sybase 的专利技术,功能非常强大。Sybase从PB10.0开始,为了使PB开发的应用可以支持.Net,就开发出来了DataWindow.net组件,可以在.net的开发环境中使用,包括DataWindow控件 和Datastore对象,功能与PB中的数据窗口控件一样。其中PB10.5的数据窗口对应DW.NET 2.0,PB11对应的是DW.NET 2.5,如果是使用PB11.5,则只能使用PB11.5里面提供的DW.NET程序集,目前Sybase还没有单独提供DW.NET的新版本,以支持PB11.5和PB12。而且PB12.Net,已经提供采用WPF技术实现的DW.NET了。
在.Net中大家经常使用的DataTable,其里面很多思想是来源于DataWindow,如缓冲区,行列状态的概念,以及根据DataTable的更新状态,生成不同的SQL来更新数据库,还有GetChanges方法来获取DataTable的更新情况等等。
为了使用DW.NET,需要先下载安装这个控件,通过以下地址 http://www.sybase.com/detail?id=1053922 可以下载到DW.NET 2.5的试用版,下载后安装即可。 注意:DW.NET 2.5支持在VS2005中集成了一个编辑DW的插件程序,如果是VS2008,则只能用DataWindow Designer这个编辑工具。如果机器没有安装VS2005,在安装的过程中,有提示DWPainter.dll文件不能注册的错误,是正常的,因为这个VS插件只支持VS2005。由于本人的计算机只安装了VS2008,没有VS2005,所以下面只能按照VS2008的开发环境进行讲解。
安装完成后,为了在.Net中使用数据窗口,我们需要先定义一个数据窗口对象。下面将使用SQL Server2000的NorthWind数据库作为数据窗口的数据源,来定义数据窗口对象,并在程序中使用它.
1. 首先,我们需要先启动 程序--Sybase--DataWindow Designer 2.5,启动程序后,首先需要通过 File --New--Project来增加一个Project 。
3.增加一个数据窗口,File ---New --DataWindow,数据窗口支持很多种展现格式,现在选择Grid这个格式,然后Next,出现数据源类源对话窗口,选择SQL Select,通过写SQL 语句的方式来定义数据源,点Next,出现选择数据表对话窗口,可以直接在上面选择需要的表名称,然后点Open,再选择需要的数据列等。
点击工具栏的Return按钮--Next--Finish,这样就完成了数据窗口的数据源定义。完成数据窗口的缺省格式如下:
点击保存,输入名称为 d_Customers,这样就完成了一个数据窗口的定义。当然,数据窗口的功能非常强大,在以后的功能介绍中,将会继续介绍数据窗口的各种功能。具体的操作,请查看帮助文档或找本PB的教程。
4.启动VS2008,新建一个WinForm的应用程序。
5.在Form1中增加一个DataWindowControl1的数据窗口控件,调整位置,并设置属性LibraryList为d:\dwTest.pbl,DataWindowObject为 d_Customers. ScrollBars为Both。然后增加几个按钮,分别为增加、删除、保存、退出。
Form1.cs的代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Sybase.DataWindow;
using System.Data.SqlClient;
namespace DWTest
{
public partial class Form1 : Form
{
SqlConnection dbConn;
AdoTransaction adoTrans;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//连接数据库,并检索数据
dbConn =new SqlConnection("Server=(local); DataBase=NorthWind;uid=sa;pwd=sa");
dbConn.Open();
adoTrans = new AdoTransaction(dbConn);
adoTrans.BindConnection();
dataWindowControl1.SetTransaction(adoTrans);
dataWindowControl1.Retrieve();
}
private void btnAdd_Click(object sender, EventArgs e)
{
//增加行,并移动记录到新增加的行
int li_Row;
li_Row=dataWindowControl1.InsertRow(0);
dataWindowControl1.ScrollToRow(li_Row);
dataWindowControl1.SetRow(li_Row);
dataWindowControl1.SetColumn(1);
dataWindowControl1.Focus();
}
protected override void OnClosed(EventArgs e)
{
adoTrans.UnbindConnection();
dbConn.Close();
base.OnClosed(e);
}
private void btnDel_Click(object sender, EventArgs e)
{
int li_Row = dataWindowControl1.CurrentRow;
if ( li_Row<= 0)
return;
//如果是新增加的行,而且还没输入任何数据,则不提示
if (dataWindowControl1.GetRowStatus(li_Row, DataBuffer.Primary) != RowStatus.New)
{
if (MessageBox.Show("你真的要删除当前记录吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
dataWindowControl1.Focus();
return;
}
}
//删除记录,注意,只是把记录移入删除缓冲区,并未真正从数据库中删除
dataWindowControl1.DeleteRow(li_Row);
dataWindowControl1.Focus();
}
private void btnSave_Click(object sender, EventArgs e)
{
dataWindowControl1.AcceptText();
if((dataWindowControl1.ModifiedCount+dataWindowControl1.DeletedCount)==0)
{
MessageBox.Show("没有数据需要保存!");
dataWindowControl1.Focus();
return;
}
//使用事务来进行数据保存
adoTrans.Transaction = dbConn.BeginTransaction();
try
{
dataWindowControl1.UpdateData();
adoTrans.Transaction.Commit();
MessageBox.Show("数据保存成功!");
}
catch(Exception ex)
{
adoTrans.Transaction.Rollback();
MessageBox.Show("数据保存失败!\r\n\r\n详细错误信息:\r\n"+ex.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
最后窗口的运行效果如下,单击增加、删除按钮可以对数据窗口进行增加删除操作,修后数据后点击保存将更新到数据库。 第一次写Blog,写得比较乱,希望大家给点意见。