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 。

 

 
    2.  然后需要先连接数据库,以这个数据库作为数据窗口的数据源。选择 Tools---Database Profiles ,在弹出的对话框中选择Ole Microsoft OLE DB,然后单击 New,增加数据源定义。 保存设置之后,选择这个设置,然后单击Connect,如果成功,则可以正常使用SQL Server的Northwind数据库作为数据窗口的数据源了。

 

 

     

 

       3.增加一个数据窗口,File ---New --DataWindow,数据窗口支持很多种展现格式,现在选择Grid这个格式,然后Next,出现数据源类源对话窗口,选择SQL Select,通过写SQL 语句的方式来定义数据源,点Next,出现选择数据表对话窗口,可以直接在上面选择需要的表名称,然后点Open,再选择需要的数据列等。

 

 
      现在我们点击Customers这个表,然后点击Open,这时会显示Customers这个数据表可以选择的数据列,右键单击Customers标题,在弹出的菜单中选择Select All,选择全部数据列.

 

 

      点击工具栏的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,写得比较乱,希望大家给点意见。

      

 

posted @ 2009-07-15 00:46  黄国酬  阅读(21751)  评论(21编辑  收藏  举报