精华内容
下载资源
问答
  • 利用C++Builder 中OLE自动化功能实现调用Word进行报表制作 一、概述  在我们利用C++Builder进行报表设计和打印处理时,我们往往是用C++Builder自己所提供的QReport组件页中的组件进行报表的设计和输出。但这样...

    利用C++Builder 中OLE自动化功能实现调用Word进行报表制作

    一、概述
      
    在我们利用C++Builder进行报表设计和打印处理时,我们往往是用C++Builder自己所提供的QReport组件页中的组件进行报表的设计和输出。但这样输出的表格都是事先设计好,并且不容易修改的表格,在系统移植后和需要对表格进行修改时就显得非常麻烦。那么,有什么好的解决方法来实现既可以自动生成报表,同时有能够对生成的报表进行灵活地修改呢?
      几乎每一个用过Miscrosoft Office 2000 中Word字处理软件的人都知道:Word是一个强大的文字、表格、排版处理软件。在Word中可以设置不同的字体、字号,绘制各种不同形状的表格……。Word强大的功能给我们在使用它的过程中留下了深刻的印象。
      如果我们能将C++Builder中处理好需要生成为报表的数据导入到Word中;在Word中对生成的报表还可以修改、排版那该多好啊!答案是肯定的,我们能够在C++Builder中调用Word ,生成各种不同的报表。

    二、实现
      下面我们将用具体的实例来说明如何运用C++Builder调用Word进行报表的设计和制作。,我们在安装了C++Builder和Word后就可以进行应用程序的设计了,在安装C++Builder的过程中将选择当前您所使用的系统中Office的版本,C++Builder可以选择两种版本:Office2000版和Office97版。在我们所举的实例中都是在Office2000版下进行的。
    (实例1)
      以下的一个例子将详细地说明在C++Builder中如何调用Word并打印出一个字符串来。
      步骤1 打开C++Builder开发平台,创建一个新的项目
      步骤2 在C++Builder的组件面板中找到Office2K组件页,在这个组件页上我们可以看到如下组件:
      在这里我们对这些组件中调用Word部分进行概括的说明:
      WordGlobal  组件:对Word的最高级属性和方法进行调用。
      WordApplication组件:Word应用程序组件,完成对Word应用程序的调用。是实现Word调用的核心组件。
      WordDocument组件:Word文档处理组件,用于处理文档的具体内容。
     
     WordFont组件:用于设置Word中的字体、字号等文字设置信息。
      
    WordParagraphFormat组件:用于对Word中的段落格式进行处理。
      WordLetterContent组件:对由信函向导创建的信函的元素进行调用的组件。


      步骤3 在新项目的Form表单中添加一个WordApplication组件,将name属性改为:            WordApp1。
      步骤4 添加一个按钮组件到Form表单上将按钮的Caption属性设置为:“Word调用”
      步骤5 双击按钮组件切换到代码编辑窗口,添加如下代码:


    try{
       WordApp->Connect();                 //与Word进行连接
       WordApp->Documents->Add();          //建立一个新文档
       WordApp->Documents->Item(Variant(1))->Range()->Text=
                        WideString("这是第一个Word调用程序");
                                                 //在文档中添加一段新文本
       WordApp->Visible=true;               //显示Word
    }
    catch(...)
    {
      ShowMessage("您可能没有安装Word!");
      WordApp->Disconnect();
    } 


      步骤6 编译运行程序。这时,我们单击“Word调用”按钮就可以看到:Word程序自动运行,同时在Word中显示出一串字符串,整个程序的调用就完成了。
    分析:
      这是最简单的Word调用实例。下面,我们就来分析一下我们所输入的代码:
             WordApp->Connect();
      这一条语句是将我们的应用程序和Word进行连接,如果连接失败可能是因为没有安装Word或Word发生错误。因此,我们用    try... catch(...)...     语句来对可能产生的错误进行处理。
             WordApp->Disconnect();
      这条语句与上一条语句是进行相反的操作,如果您已经与Word进行了连接,那么这条语句就是断开与Word的连接。需要注意的是:如果您没有关闭Word程序,在C++Builder中运行该语句,则可能导致产生连接错误。
             WordApp->Documents->Add();
      这条语句是在Word中建立一个新的文档,由于Word是一个多文档的处理程序,因此我们可以建立多个文档来进行操作。文档间又由Document下的Item函数来区分的。例如在程序中我们使用了:
             WordApp->Documents->Item(Variant(1))来返回一个具体文档的指针。
      Range()函数是用来设置在文档中所操作文本的范围,如果Range()函数中没有任何参数,则表明在所有的范围内进行操作。我们利用Range返回的指针中Text属性写入一个字符串,在文档中就可以看到这个字符串了。
      最后我们所做的工作就是将Word程序运行的结果显示出来。我们运用WordApp->Visible属性来实现。


    (实例2) 
      在这个实例中,我们将更加深入地探讨C++Builder调用Word程序实现报表的方法。其中将包括字体的设置,段落的格式等操作。我们将在Word中输出三段文字其中第一段文字的字体设置为黑体并且居中、字号为二号字,第二段文字将字体设置为宋体五号字,第三段文字将居右并为宋体小五号字。
    我们建立两个调用Word的对象,一个为WordApplication对象,另一个为WordDocument对象。对象的名称分别为:WordApp和WordDoc。
      下面是整个程序的代码:
     


    try{
         WordApp->Connect();                                           //连接Word
         WordApp->Documents->Add();                                    //建立一个新文档
         WordDoc->ConnectTo(WordApp->Documents->Item(Variant(1))); 
                            //将WordDocument对象与WordApplication对象进行连接
         WordDoc->Paragraphs->Add();                                   //添加一个段
         WordDoc->Paragraphs->Item(Variant(1))->Range->Font->Name=
                            WideString("黑体");                        //设置该段文本字体
         WordDoc->Paragraphs->Item(Variant(1))->Range->Font->Size=20;  //设置字号
         WordDoc->Paragraphs->Item(Variant(1))->Range->Text=
                            WideString("这是第一段文字!");               //当前段文字
         WordDoc->Paragraphs->Item(Variant(1))->Alignment=1;           //设置该段文字居中
         WordDoc->Paragraphs->Add();                                   //添加一个段
         WordDoc->Paragraphs->Item(Variant(2))->Range->Font->Name=
                            WideString("宋体");                        //设置该段文本字体
         WordDoc->Paragraphs->Item(Variant(2))->Range->Font->Size=12;  //设置字号
         WordDoc->Paragraphs->Item(Variant(2))->Range->Text=
                            WideString("这是第二段文字!");              //当前段文字
         WordDoc->Paragraphs->Item(Variant(2))->Alignment=0;           //设置该段文字居左
         WordDoc->Paragraphs->Add();                                   //添加一个段
         WordDoc->Paragraphs->Item(Variant(3))->Range->Font->Name=
                            WideString("宋体");                        //设置该段文本字体
         WordDoc->Paragraphs->Item(Variant(3))->Range->Font->Size=10;  //设置字号
         WordDoc->Paragraphs->Item(Variant(3))->Range->Text=
                            WideString("这是第三段文字!");              //当前段文字
         WordDoc->Paragraphs->Item(Variant(3))->Alignment=2;          //设置该段文字居右
         WordApp->Visible=true;
       }
       catch(...)
       {
         ShowMessage("您可能没有安装Word!");
         WordApp->Disconnect();
       }

    分析:
      在这段程序中我们使用了两个关于Word调用的组件,在WordDocument组件中我们运用ConnectTo函数与WordApplication相连接,通过这种连接就可以方便地使用WordDocument组件所提供的功能对Word的其中一个文档进行具体地操作。使我们更加方便地控制与修改我们所产生的报表。
       在WordDocument组件的使用中,我们运用了Paragraphs来对Word中的段落进行操作,其中包括了段落中字体的设置和段落的排版式样等。由此可见C++Builder为我们提供了一个非常方便的Word调用组件来让我们实现Word的应用。
    拓展:
      如果我们需要对段落中的其中一部分进行字体的设置那应该怎么办呢?我们在刚才的程序中看到:对段落的字体进行设置的语句是这样的:
       WordDoc->Paragraphs->Item(Variant(2))->Range->Font->Size=12;
    假如我们要设置段落中第5个字符为9号字,那么我们就需要限制字体设置的范围,程序如下:
    WordDoc->Paragraphs->Item(Variant(2))->Range->Select();//将第二段文字选择上
    WordApp->Selection->Start=WordApp->Selection->Start+5;
                                              //在选择的范围中的第5个字符作为选择的开始字符
    WordApp->Selection->End=WordApp->Selection->Start+1;
                                              //将选择的结束字符设置为开始字符加1个字符
    WordApp->Selection->Font->Size=9;         //将最后选择的字符的字体设置为9号字


    (实例3)
      这个实例将说明在C++Builder中调用Word绘制表格的方法,其中包括表格的生成、单元格的控制与操作等。下面的这段代码将实现在Word中绘制一个4乘8的表格。


    WordDoc->Tables->Add(WordDoc->Range(EmptyParam,EmptyParam),4,8);  
                                                       //在Word中添加一个表格


      在这里我们调用了WordDocument对象中的Tables来实现表格的绘制。Add函数是添加一个表格。其中的参数为:表格添加在文档中的位置,表格行,表格列的数量。参数中EmptyParam为已定义的常量。如果我们需要将表格添加到整个文档的末尾,我们可以将这段代码改为:

    WordDoc->Tables->Add(WordDoc->
          Range(Variant(WordDoc->Range(EmptyParam,EmptyParam)->End-1),EmptyParam),4,8);  
                                                       //在Word文档末尾添加一个表格


    在表格中,我们如果需要对单元格进行操作,例如在第3行、第5列的这个单元格我们需要插入一段文本,则可以这样操作:


    WordDoc->Tables->Item(Variant(1))->
             Cell(Variant(3),Variant(5))->Range->Text=WideString("添加的文本");


    其中,Item中的值为指定需要进行操作的表格。Cell中的值为指定表格中的单元格位置。
      在表格中如果我们需要合并两个单元格可以对单元格进行如下操作:


    WordDoc->Tables->Item(Variant(1))->Cell(Variant(3),Variant(5))->
               Marge(WordDoc->Tables->Item(Variant(1))->Cell(Variant(3),Variant(6)));
                                                      //将表格中(3,5)与(3,6)单元格合并


    在表格中如果我们需要拆分单元格则进行如下操作:


    WordDoc->Tables->Item(Variant(1))->Cell(Variant(3),Variant(5))->
                Split(Variant(2),Variant(3));
                                                 //将表格中(3,5)单元格拆分为2行3列的单元格


     通过这个实例我们掌握了C++Builder中调用Word进行表格绘制的基本方法,同时对表格中单元格的基本操作也有了一定地了解。下面的实例是如何在Word中添加图像。


    我们在Word中添加图像的基本方法是运用剪贴板来进行图像的添加的。我们先把图像复制到剪贴板然后在Word中粘贴就可以了。例如我们从数据库中存储的图像调入到Word中其代码如下:


       DBImage->CopyToClipboard();             //图像复制到剪贴板
             WordDoc->Sentences->Last->Paste();      //粘贴到Word中    


    小结:
      关于在C++Builder中调用Office来进行数据、报表等处理的方法还有很多种。在这里我仅仅只是介绍了Word调用中常用到的几种调用方法,涉及到的范围还很小。我只是希望能够引起大家对程序开发感兴趣,运用C++Builder开发出更多、更好的应用程序来。
    展开全文
  • 这里需要注意的是不是所有类型的列都可以直接select回来,TIMESTAMP类型的列就需要先to_char, 不同的数据类型在oracle里和.net表示的方法不一样, 用oledb的时候又不会自动转换,所以对于特殊的类型会出错,稳妥起见...

    数据库脚本:

       CREATE TABLE DEPT
       (DEPTNO NUMBER(2,0) NOT NULL,
       DNAME VARCHAR2(14) NULL,
       LOC VARCHAR2(13) NULL,
       PRIMARY KEY (DEPTNO)
       );

       INSERT INTO Dept VALUES(11,'Sales','Texas');
       INSERT INTO Dept VALUES(22,'Accounting','Washington');
       INSERT INTO Dept VALUES(33,'Finance','Maine');

       CREATE TABLE EMP
       (EMPNO NUMBER(4,0) NOT NULL,
       ENAME VARCHAR2(10) NULL,
       JOB VARCHAR2(9) NULL,
       MGR NUMBER(4,0) NULL,
       SAL NUMBER(7,2) NULL,
       COMM NUMBER(7,2) NULL,
       DEPTNO NUMBER(2,0) NULL,
       FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO), 
       PRIMARY KEY (EMPNO)
       );

       INSERT INTO Emp VALUES(123,'Bob','Sales',555,35000,12,11);
       INSERT INTO Emp VALUES(321,'Sue','Finance',555,42000,12,33);
       INSERT INTO Emp VALUES(234,'Mary','Account',555,33000,12,22);
      
       CREATE OR REPLACE PACKAGE curspkg_join AS
        TYPE t_cursor IS REF CURSOR ;
        Procedure open_join_cursor1 (io_cursor IN OUT t_cursor);
       END curspkg_join;
      
       CREATE OR REPLACE PACKAGE BODY curspkg_join AS
       Procedure open_join_cursor1 (io_cursor IN OUT t_cursor)
       IS
        v_cursor t_cursor;
       BEGIN
        IF n_EMPNO <> 0
        THEN
         OPEN v_cursor FOR
         SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME
          FROM EMP, DEPT
          WHERE EMP.DEPTNO = DEPT.DEPTNO
          --AND EMP.EMPNO = n_EMPNO;

        ELSE
         OPEN v_cursor FOR
         SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME
          FROM EMP, DEPT
          WHERE EMP.DEPTNO = DEPT.DEPTNO;

        END IF;
        io_cursor := v_cursor;
       END open_join_cursor1;
       END curspkg_join;
      
       --drop table dept;
       --drop table emp;
       --drop PACKAGE curspkg_join; 

     

    调用代码:

    OleDbConnection Oraclecon = new OleDbConnection("Provider=MSDAORA.1;Password=tiger;"
                  + "User ID=scott;Data Source=OracleServer;Persist Security Info=True");
    Oraclecon.Open();
    OleDbCommand myCMD =  new OleDbCommand
    ("{call curspkg_join.open_join_cursor1(?, {resultset 0, io_cursor})}", Oraclecon);
    myCMD.Parameters.Add("ID", OleDbType.Numeric, 4).Value = 0;
    OleDbDataReader myReader;
    myReader = myCMD.ExecuteReader();
    int x;
    int count;
    count = 0;
    while (myReader.Read())

    {
    for (x = 0; x <= myReader.FieldCount - 1; x++)
    Console.Write(myReader.GetValue(x) + " ");

         
    Console.WriteLine();
    count += 1;
    }


    MessageBox.Show(count + " Rows Returned.");
    myReader.Close();
    Oraclecon.Close();

     

    原文:http://support.microsoft.com/default.aspx?scid=kb;en-us;309361

    How To Use a DataReader Against an Oracle Stored Procedure in Visual C# .NET

    这里仅仅摘出了必要的代码,调试通过! 这里需要注意的是不是所有类型的列都可以直接select回来,TIMESTAMP类型的列就需要先to_char, 不同的数据类型在oracle里和.net表示的方法不一样, 用oledb的时候又不会自动转换,所以对于特殊的类型会出错,稳妥起见所有特殊类型都以字符串返回.

    create or replace procedure sp_sm_administrators_select(
    admins_cursor out GLOBALPKG.t_cursor
    )
    is
    begin
      open admins_cursor for
      select
          id,
          user_id,
          user_name,
          user_psw,
          to_char(create_date) as create_date,
          memo
      from sm_administrators
      order by create_date;
    end sp_sm_administrators_select;

    展开全文
  • 利用C++Builder 6 中OLE自动化功能实现调用Word进行报表制作本文为原有篇幅在CB6下编写代码的补充,CB5下开发可以参考原有文章一、概述 在我们利用C++Builder进行报表设计和打印处理时,我们往往是用C++Builder自己...

    利用C++Builder 6 中OLE自动化功能实现调用Word进行报表制作
    本文为原有篇幅在CB6下编写代码的补充,CB5下开发可以参考原有文章

    一、概述
      
    在我们利用C++Builder进行报表设计和打印处理时,我们往往是用C++Builder自己所提供的QReport组件页中的组件进行报表的设计和输出。但这样输出的表格都是事先设计好,并且不容易修改的表格,在系统移植后和需要对表格进行修改时就显得非常麻烦。那么,有什么好的解决方法来实现既可以自动生成报表,同时有能够对生成的报表进行灵活地修改呢?
      几乎每一个用过Miscrosoft Office 2000 中Word字处理软件的人都知道:Word是一个强大的文字、表格、排版处理软件。在Word中可以设置不同的字体、字号,绘制各种不同形状的表格……。Word强大的功能给我们在使用它的过程中留下了深刻的印象。
      如果我们能将C++Builder中处理好需要生成为报表的数据导入到Word中;在Word中对生成的报表还可以修改、排版那该多好啊!答案是肯定的,我们能够在C++Builder中调用Word ,生成各种不同的报表。

    二、实现
      下面我们将用具体的实例来说明如何运用C++Builder调用Word进行报表的设计和制作。,我们在安装了C++Builder和Word后就可以进行应用程序的设计了,在安装C++Builder的过程中将选择当前您所使用的系统中Office的版本,C++Builder可以选择两种版本:Office2000版和Office97版。在我们所举的实例中都是在Office2000版下进行的。

     

    (实例1)
      以下的一个例子将详细地说明在C++Builder中如何调用Word并打印出一个字符串来。
      
    步骤1 打开C++Builder开发平台,创建一个新的项目
      步骤2 在C++Builder的组件面板中找到Office2K组件页,在这个组件页上我们可以看到如下组件:
      在这里我们对这些组件中调用Word部分进行概括的说明:
      WordGlobal  组件:对Word的最高级属性和方法进行调用。
      WordApplication组件:Word应用程序组件,完成对Word应用程序的调用。是实现Word调用的核心组件。

      WordDocument组件:Word文档处理组件,用于处理文档的具体内容。
      WordFont组件:用于设置Word中的字体、字号等文字设置信息。
      WordParagraphFormat组件:用于对Word中的段落格式进行处理。
      WordLetterContent组件:对由信函向导创建的信函的元素进行调用的组件。


      步骤3 在新项目的Form表单中添加一个WordApplication组件,将name属性改为:            WordApp1。
      步骤4 添加一个按钮组件到Form表单上将按钮的Caption属性设置为:“Word调用”
      步骤5 双击按钮组件切换到代码编辑窗口,添加如下代码:


    try{
       WordApp->Connect();              
    //与Word进行连接
       WordApp->Documents->Add();         
    //建立一个新文档
       WordApp->Documents->Item(Variant(1))->Range()->InsertAfter(StringToOleStr("这是一段测试文字"));
                           
    //在文档中添加一段新文本
       WordApp->Application->Visible=true//显示Word

    }
    catch(...)

    {
      ShowMessage("您可能没有安装Word!");
      WordApp->Disconnect();
    } 


      步骤6 编译运行程序。这时,我们单击“Word调用”按钮就可以看到:Word程序自动运行,同时在Word中显示出一串字符串,整个程序的调用就完成了。
    分析:

      这是最简单的Word调用实例。下面,我们就来分析一下我们所输入的代码:
             WordApp->Connect();
      这一条语句是将我们的应用程序和Word进行连接,如果连接失败可能是因为没有安装Word或Word发生错误。因此,我们用    try... catch(...)...     语句来对可能产生的错误进行处理。
             WordApp->Disconnect();
      这条语句与上一条语句是进行相反的操作,如果您已经与Word进行了连接,那么这条语句就是断开与Word的连接。需要注意的是:如果您没有关闭Word程序,在C++Builder中运行该语句,则可能导致产生连接错误。
             WordApp->Documents->Add();
      这条语句是在Word中建立一个新的文档,由于Word是一个多文档的处理程序,因此我们可以建立多个文档来进行操作。文档间又由Document下的Item函数来区分的。例如在程序中我们使用了:
             WordApp->Documents->Item(Variant(1))来返回一个具体文档的指针。
      Range()函数是用来设置在文档中所操作文本的范围,如果Range()函数中没有任何参数,则表明在所有的范围内进行操作。我们利用Range返回的指针中Text属性写入一个字符串,在文档中就可以看到这个字符串了。
      最后我们所做的工作就是将Word程序运行的结果显示出来。我们运用 
                      WordApp->Application->Visible属性来实现



     

    (实例2) 
      在这个实例中,我们将更加深入地探讨C++Builder调用Word程序实现报表的方法。其中将包括字体的设置,段落的格式等操作。我们将在Word中输出三段文字其中第一段文字的字体设置为黑体并且居中、字号为二号字,第二段文字将字体设置为宋体五号字,第三段文字将居右并为宋体小五号字。
    我们建立两个调用Word的对象,一个为WordApplication对象,另一个为WordDocument对象。对象的名称分别为:WordApp和WordDoc。
      下面是整个程序的代码: 


    try{
         WordApp->Connect();                                         //连接Word
         WordApp->Documents->Add();                                  //建立一个新文档
         WordDoc->ConnectTo(WordApp->Documents->Item(Variant(1)));
                                          //将WordDocument对象与WordApplication对象进行连接
         WordDoc->Paragraphs->Add();                                 //添加一个段
        WordDoc->Paragraphs->Item(Variant(1))->Range->Font->set_Name(WideString("黑体"));
                                                                     //设置该段文本字体
         WordDoc->Paragraphs->Item(Variant(1))->Range->Font->set_Size(20);  //设置字号
         WordDoc->Paragraphs->Item(Variant(1))->Range->set_Text(WideString("这是第一段文字!"));
                                                                     //当前段文字
         WordDoc->Paragraphs->Item(Variant(1))->Alignment=wdAlignParagraphCenter;
                                                                    //设置该段文字居中
         WordDoc->Paragraphs->Add();                                //添加一个段
         WordDoc->Paragraphs->Item(Variant(2))->Range->Font->set_Name(WideString("宋体"));
                                                                    //设置该段文本字体
         WordDoc->Paragraphs->Item(Variant(2))->Range->Font->set_Size(12);  //设置字号
         WordDoc->Paragraphs->Item(Variant(2))->Range->set_Text(WideString("这是第二段文字!")); 
                                                                    //当前段文字
         WordDoc->Paragraphs->Item(Variant(2))->Alignment=wdAlignParagraphLeft;
                                                                    //设置该段文字居左
         WordDoc->Paragraphs->Add();                                //添加一个段
         WordDoc->Paragraphs->Item(Variant(3))->Range->Font->set_Name(WideString("宋体"));
                                                                    //设置该段文本字体
         WordDoc->Paragraphs->Item(Variant(3))->Range->Font->set_Size(10);  //设置字号
         WordDoc->Paragraphs->Item(Variant(3))->Range->set_Text(WideString("这是第三段文字!"));
                                                                    //当前段文字
         WordDoc->Paragraphs->Item(Variant(3))->Alignment=wdAlignParagraphRight;
                                                                  //设置该段文字居右
         WordApp->Application->Visible=true;
       }
       catch(...)

       {
         ShowMessage("您可能没有安装Word!");
         WordApp->Disconnect();
       }

    分析:
      在这段程序中我们使用了两个关于Word调用的组件,在WordDocument组件中我们运用ConnectTo函数与WordApplication相连接,通过这种连接就可以方便地使用WordDocument组件所提供的功能对Word的其中一个文档进行具体地操作。使我们更加方便地控制与修改我们所产生的报表。
     
      在WordDocument组件的使用中,我们运用了Paragraphs来对Word中的段落进行操作,其中包括了段落中字体的设置和段落的排版式样等。由此可见C++Builder为我们提供了一个非常方便的Word调用组件来让我们实现Word的应用。
    拓展:
      如果我们需要对段落中的其中一部分进行字体的设置那应该怎么办呢?我们在刚才的程序中看到:对段落的字体进行设置的语句是这样的:
       WordDoc->Paragraphs->Item(Variant(2))->Range->Font->set_Size(12);
    假如我们要设置段落中第5个字符为9号字,那么我们就需要限制字体设置的范围,程序如下:


    WordDoc->Paragraphs->Item(Variant(2))->Range->Select();//将第二段文字选择上
    WordApp->Selection->Start=WordApp->Selection->Start+5;
                                              //
    在选择的范围中的第5个字符作为选择的开始字符
    WordApp->Selection->End=WordApp->Selection->Start+1;
                                              //
    将选择的结束字符设置为开始字符加1个字符
    WordApp->Selection->Font->set_Size(9);         //
    将最后选择的字符的字体设置为9号字



    (实例3)
      这个实例将说明在C++Builder中调用Word绘制表格的方法,其中包括表格的生成、单元格的控制与操作等。下面的这段代码将实现在Word中绘制一个4乘8的表格。



    WordDoc->Tables->Add(WordDoc->Range(EmptyParam,EmptyParam),4,8); 
                                                       //
    Word中添加一个表格



      在这里我们调用了WordDocument对象中的Tables来实现表格的绘制。Add函数是添加一个表格。其中的参数为:表格添加在文档中的位置,表格行,表格列的数量。参数中EmptyParam为已定义的常量。如果我们需要将表格添加到整个文档的末尾,我们可以将这段代码改为:



    WordDoc->Tables->Add(WordDoc->
          Range(Variant(WordDoc->Range(EmptyParam,EmptyParam)->End-1),EmptyParam),4,8); 
                                                       //
    Word文档末尾添加一个表格




     

     

    在表格中,我们如果需要对单元格进行操作,例如在第3行、第5列的这个单元格我们需要插入一段文本,则可以这样操作:



    WordDoc->Tables->Item(Variant(1))->
             Cell(Variant(3),Variant(5))->Range->set_Text(WideString("
    添加的文本"));



    其中,Item中的值为指定需要进行操作的表格。Cell中的值为指定表格中的单元格位置。
      在表格中如果我们需要合并两个单元格可以对单元格进行如下操作:



    WordDoc->Tables->Item(Variant(1))->Cell(Variant(3),Variant(5))->
               Marge(WordDoc->Tables->Item(Variant(1))->Cell(Variant(3),Variant(6)));
                                                      //
    将表格中(3,5)(3,6)单元格合并



    在表格中如果我们需要拆分单元格则进行如下操作:



    WordDoc->Tables->Item(Variant(1))->Cell(Variant(3),Variant(5))->
                Split(Variant(2),Variant(3));
                                                 //
    将表格中(3,5)单元格拆分为23列的单元格



     通过这个实例我们掌握了C++Builder中调用Word进行表格绘制的基本方法,同时对表格中单元格的基本操作也有了一定地了解。下面的实例是如何在Word中添加图像。



    我们在Word中添加图像的基本方法是运用剪贴板来进行图像的添加的。我们先把图像复制到剪贴板然后在Word中粘贴就可以了。例如我们从数据库中存储的图像调入到Word中其代码如下:



       DBImage->CopyToClipboard();             //
    图像复制到剪贴板
             WordDoc->Sentences->Last->Paste();      //
    粘贴到Word    



    小结:
      关于在C++Builder中调用Office来进行数据、报表等处理的方法还有很多种。在这里我仅仅只是介绍了Word调用中常用到的几种调用方法,涉及到的范围还很小。我只是希望能够引起大家对程序开发感兴趣,运用C++Builder开发出更多、更好的应用程序来。
       

     

    展开全文
  • 在ADO调用返回记录集的存储过程时,OLE DB自动存储过程中REF CURSOR类型的传出参数返回记录集,该记录集可以赋值给一个Recordset对象。如果PL/SQL存储过程有一个或多个REF CURSOR类型的传出参数,OLE DB将这些...

     来源:网络/责编:编程入门 作者:不详
    <script src="http://www.bianceng.cn/js1/468.js"></script>

    <script src="http://www.bianceng.cn/js1/300.js"></script> <script type="text/javascript"><!-- google_ad_client = "pub-1762970342420142"; /* 300x250 */ google_ad_slot = "2904782163"; google_ad_width = 300; google_ad_height = 250; //--> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script> <script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script> <script>window.google_render_ad();</script>

      摘要 OLE DB是建立在ODBC成功基础上的一种开放规范,它为访问和操纵不同类型数据提供开放的标准。ADO是OLD DB的一个消费者,它提供了对OLE DB数据源应用级的访问功能。在应用程序中使用OLE DB和ADO,可以高效地调用返回记录集的Oracle存储过程。

      关键字 OLE DB ADO 存储过程 记录集

      1 前言

      在基于Oracle数据库的ADO应用程序的开发过程中,为了提高执行速度和降低网络流量,往往要在应用程序中调用Oracle数据库服务器端 的存储过程。有的存储过程需要返回多行的记录集。这种情况下,在应用程序中调用返回记录集的存储过程存在一定的难度。本文介绍如何使用OLE DB和ADO调用返回记录集的Oracle存储过程。

      2 OLE DB和ADO的关系

      2.1 OLE DB简介

      OLE DB建立在ODBC成功基础上的开放的规范,它为访问和操纵不同类型数据提供开放的标准。OLE DB定义了一个COM接口集合,它封装了各种数据库管理系统服务。这些接口允许创建实现这些服务的软件组件。OLE DB组件包括数据提供者(存储和发布数据)、数据消费者(使用数据)和服务组件(处理和传输数据)。

      OLE DB的设计是以消费者和提供者概念为中心。OLE DB消费者表示传统的客户方,提供者将数据以表格形式传递给消费者。OLE DB的Oracle提供者(OraOLEDB)可使OLE DB消费者高效地访问Oracle数据源。图1给出OLE DB的系统图示。OLE DB数据提供者将数据从数据源传递给消费者。在标准接口的基础上,OLE DB消费者能够访问来自提供者的数据。因为有COM组件,消费者可以用任何支持COM的编程语言访问数据。

      2.2 ADO对象模在ADO对象模型中,Connection、Command和Recordset对象是三个主要的对象。Connection对象表示对远程 数据的连接。Connection对象可与Command对象或Recordset对象关联。Command对象定义了对数据源执行的指定命令。 Command对象可以用来执行命令和参数化的SQL语句,可以用于SQL语句和返回记录集的SQL查询。Command对象既可以使用一个活动的 Connection对象,也可以创建它自己到目标数据源的连接。Command对象包含一个Parameters集合,在该集合中每一个 Parameter对象表示Command对象使用的参数。Command对象执行参数化的SQL语句时,每一个Parameter对象表示SQL语句中 的一个参数。Recordset对象表示的来自基本表或命令执行结果的记录全集。Recordset对象既可以使用一个活动的Connection对象, 也可以创建它自己到目标数据源的连接。Recordset对象允许查询和修改数据。每一个Recordset包含一个Field对象集合,其中,每个 Field对象表示Recordset中一个数据列。

      2.3 ADO和OLE DB的关系

      OLE DB是系统级编程接口,ADO是应用软件级编程接口。ADO是OLE DB的一个消费者,它提供了对OLE DB数据源应用级的访问功能。ADO为OLE DB提供了一个易于使用的应用级接口。ADO允许用户编写通过OLE DB提供者对数据库服务器中的数据进行访问和操作的应用程序。其主要的优点是易于使用、高速度、低内存和占用较少的磁盘空间。ADO和OLE DB的关系如图2所示:

      3 Oracle中返回记录集的存储过程的定义

      在Oracle存储过程中,通过定义类型为REF CURSOR(游标指针)的传出参数,可以返回记录集。OLE DB允许消费者执行带REF CURSOR类型参数的PL/SQL存储过程,或者执行返回REF CURSOR的存储函数。返回记录集的存储过程或函数必须定义在程序包里。包是Oracle数据库的一种对象,它可以将数据类型、存储过程、函数、变量和 常量封装在一起。包在结构上分为包头和包体两部分,这两部分要分别建立。包头用来定义可被外部引用的元素;包体定义实际代码。使用程序包定义返回记录集的 存储过程时,需要在包头中预定义自己的REF CURSOR类型。在程序包体中,存储过程或函数须使用预定义的游标类型。另外,在一个存储过程或函数中,可以定义多个REF CURSOR类型的参数以返回多个记录集。

      以下以职工表emp为例,介绍如何定义返回记录集的Oracle存储过程,emp表的定义如下:

    CREATE TABLE emp(
    empno NUMBER(4) NOT NULL, --职工编号
    ename VARCHAR2(10), --职工姓名
    hiredate DATE, --雇佣日期
    sal NUMBER(7,2), --工资
    deptno NUMBER(2)); --所属部门编号

    下面给出返回记录集的Oracle存储过程和存储函数的示例程序包头和包体,其中存储过程GetEmpRecords含有两个REF CURSOR类型的传出参数,返回两个记录集,存储函数GetDept的返回值类型为REF CURSOR,返回一个记录集。

    --定义一个名为Employees的程序包头
    CREATE OR REPLACE PACKAGE Employees AS
    TYPE empcur IS REF CURSOR;
    --empcur为自定义REF CURSOR类型
    --声明一个存储过程GetEmpRecords
    PROCEDURE GetEmpRecords(p_cursor OUT empcur,
    q_cursor OUT empcur,
    indeptno IN NUMBER,
    p_errorcode OUT NUMBER);
    --声明一个存储函数GetDept
    FUNCTION GetDept(inempno IN NUMBER,
    p_errorcode OUT NUMBER)
    RETURN empcur;
    END Employees; ---程序包头定义结束
    --定义Employees的程序包体
    --定义存储过程GetEmpRecords
    CREATE OR REPLACE PACKAGE BODY Employees AS PROCEDURE GetEmpRecords(p_cursor OUT empcur, q_cursor OUT empcur,
    indeptno IN NUMBER, p_errorcode OUT NUMBER) IS
    BEGIN
    p_errorcode := 0; -- p_errorcode为错误编号
    --打开游标变量p_cursor,查询所属部门编号
    --为indeptno的所有职工的信息
    OPEN p_cursor FOR
    SELECT * FROM emp
    WHERE deptno = indeptno ORDER BY empno;
    --打开游标变量q_cursor,查询所属部门编号
    --为indeptno的所有职工的编号信息
    OPEN q_cursor FOR
    SELECT empno FROM emp
    WHERE deptno = indeptno ORDER BY empno;
    EXCEPTION --例外处理
    WHEN OTHERS THEN
    p_errorcode:= SQLCODE;
    END GetEmpRecords; --存储过程GetEmpRecords定义结束
    --定义存储函数GetDept
    FUNCTION GetDept(inempno IN NUMBER,
    p_errorcode OUT NUMBER)
    RETURN empcur IS p_cursor empcur; --返回值
    BEGIN
    p_errorcode := 0;

      --查询职工编号为inempno的职工的所属部门编号

      OPEN p_cursor FOR

      SELECT deptno FROM emp WHERE empno = inempno;

      RETURN (p_cursor);

      EXCEPTION

      WHEN OTHERS THEN

      p_errorcode:= SQLCODE;

      END GetDept;

      END Employees; --程序包体定义结束

     4 利用ADO调用返回记录集的Oracle存储过程

      使用OLE DB和ADO调用返回记录集的Oracle存储过程,在定义ADO对象和设置参数时,需要特定的设置。

      4.1 设定数据库连接字符串

      在ADO应用程序中,如果要访问返回记录集的Oracle存储过程,需要使用OraOLE DB的数据库连接字符串的指定格式。在连接字符串中,PLSQLRSet属性表明OraOLE DB是否需要从PL/SQL存储过程返回记录集。如果需要返回记录集,PLSQLRSet设为1,否则设置为0,默认为 0。在Command命令执行后,该属性需要设置为0。

      4.2 参数的设置

      在ADO应用程序中,可以定义调用存储过程的参数。可使用Command对象的CreateParameter 方法创建Parameter 对象,并使用 Append 方法将它们添加到 Parameters 集合,在调用存储过程时,Parameters 集合将参数传递给存储过程。由于OraOLE DB采用定位传递参数的格式,即Command对象在调用存储过程时,调用参数的位置应和存储过程的参数的位置相对应。根据调用的存储过程的参数属性、名 称和位置,在ADO中, Append 方法添加参数的次序应和存储过程中参数的顺序一致。

      在OLE DB的标准中,没有REF CURSOR类型的预定义数据类型,因此在调用存储过程时,不能创建REF CURSOR类型的参数。在ADO调用返回记录集的存储过程时,OLE DB自动为存储过程中REF CURSOR类型的传出参数返回记录集,该记录集可以赋值给一个Recordset对象。如果PL/SQL存储过程有一个或多个REF CURSOR类型的传出参数,OLE DB将这些参数的记录集集成在一起,并通过第一个REF CURSOR类型的传出参数返回,这些记录集同样可以赋值给一个Recordset对象。

      4.3 调用存储过程的格式

      调用返回记录集存储过程之前,应将Command对象的 CommandType 属性指定SQL类型以优化查询性能,即CommandType 属性值设为AdCmdText。

      使用 Command对象的CommandText 属性定义调用存储过程的命令。当使用Command对象执行Oracle返回记录集存储过程时,须以odbc转义符调用格式来调用存储过程,例如: {call credit_account(?,?)}。在这种格式中,传入和传出参数都用问号“?”来表示。

      4.4返回记录集

      可使用Command对象的 Execute 方法调用Oracle返回记录集的存储过程,并在适当的时候将结果记录集返回给 Recordset对象。该对象可以存储一个或多个结果记录集。当存储多个记录集时,可以用Recordset对象的NextRecordSet属性获得 下一个记录集。

      下面给出在ASP中调用返回存储过程或函数的示例程序:

    <%@ Language=VBScript %>
    <!--#include file="adovbs.inc"-->
    <%
    'Connection 对象代表了打开的、与数据源的连接。
    set Con=server.CreateObject("ADODB.Connection")
    set Rst1 =server.CreateObject("ADODB.Recordset")
    set Rst2=server.CreateObject("ADODB.Recordset")
    set Cmd =server.CreateObject("ADODB.Command")
    set Prm1 =server.CreateObject("ADODB.Parameter")
    set Prm2 =server.CreateObject("ADODB.Parameter")
    Con.Provider = "OraOLEDB.Oracle" '设置OLE DB提供者
    '设置数据库连接字符串,test是数据库网络服务名
    Con.ConnectionString = "Data Source=TEST;" & _
    "User ID=scott;Password=tiger;PLSQLRSet=1"
    '调用返回记录集的存储过程,PLSQLRSet指定为1
    Con.Open
    '创建Command对象到目标数据源的连接
    Cmd.ActiveConnection = Con
    cmd.CommandType=adcmdtext
    '虽然Employees.GetEmpRecords()有四个参数,
    '但只有需要设定两个参数
    '因为REF CURSOR参数由OLE DB连接提供者自动设定。
    Set Prm1 = Cmd.CreateParameter("Prm1", adSmallInt, adParamInput, , 30) '创建一个输入参数,对应于indeptno
    Cmd.Parameters.Append Prm1 '将参数添加到参数集合中
    Set Prm2 = Cmd.CreateParameter("Prm2", adSmallInt, adParamOutput) '创建一个输出参数,对应于p_errorcode
    Cmd.Parameters.Append Prm2
    '调用返回记录集的存储过程必须使用odbc的转义符调用格式。
    Cmd.CommandText = "{CALL Employees.GetEmpRecords(?, ?)}"
    'GetEmpRecords存储过程返回两个记录集,获得第一个记录集
    Set Rst1 = Cmd.Execute %>
    <TABLE border = 1>
    <%
    Do while (Not rst1.eof) %>
    <tr>
    <% For Index=0 to (rst1.fields.count-1) %>
    <TD VAlign=top><% = rst1(Index)%></TD>
    <% Next %>
    </tr>
    <% rst1.MoveNext
    Loop '显示第一个记录集
    %>
    </TABLE>
    <%'获得GetEmpRecords存储过程返回的第二个记录集
    Set Rst2 = Rst1.NextRecordset
    '在此可加入显示第二个记录集的代码
    Prm1.Value = 7369 '该参数对应于存储函数的inempno
    Prm2.Value = 0 '该参数对应于存储函数的p_errorcode
    '调用返回记录集的存储函数
    Cmd.CommandText = "{CALL Employees.GetDept(?, ?)}"
    '获得GetDept存储函数返回的记录集
    Set Rst2 = Cmd.Execute
    Rst1.Close
    Rst2.Close
    set rst1=nothing
    set rst2=nothing
    con.close
    set con=nothing
    %>
    <P> </P>
    </BODY>
    </HTML>

      5 小结

      在应用程序中,使用OLE DB和ADO访问返回记录集的存储过程,OLE DB服务者可以高效地将数据库端的多行记录集返回给ADO应用程序。在ADO应用程序中,使用Command对象可以传递输入或输出参数给存储过程,并调用存储过程以获得多行记录集。

    展开全文
  • C# 执行存储过程自动产生序列号,反回数据集,反回OUTPUT参数
  • OLE1.0和OLE2.0

    千次阅读 2011-10-17 18:30:57
    OLE1.0和OLE2.0   迄今为止,有两种版本的OLEOLE1.0和OLE2.0。当用户在OLE1.0 服务器中激活OLE对象,服务器程 序在前台打开自己的窗体,并获得焦点。OLE窗体失去焦点,存在于单独的窗体之中。  OLE2.0服务器...
  • pb数据窗口控件OLE

    2020-07-12 22:30:19
    OLE自动化是不同应用程序之间进行通讯的一个标准。 OLE自动化的工作方式是:通讯被动方(OLE服务器)应用程序向通讯主动方(OLE客户机)应用程序提供一个以上可供其调用的OLE自动化对象类型,OLE客户机通过引用这些...
  • OLE技术

    千次阅读 2013-06-11 01:31:35
    OLE技术   译者注:(整体通讯架构:OLE客户端应用程序 ——> OLE客户端库 ——> OLE服务器库 ——> OLE服务器应用程序)   概要:  OLE是一种技术,可以用来创建复杂文档,这些复杂文档包含的信息...
  • 结构化存储OLE对象

    2019-09-29 18:11:53
     // MyOleDoc.ole 复合文档的Database 存储下,并以名为employee的流进行保存  OleStream1.Free;  Hre:=SubStorage.CreateStream('customer',STGM_CREATE or STGM_READWRITE or  STGM_DIRECT or STGM_SHARE_...
  • OLE 对象

    千次阅读 2008-01-25 13:00:00
    sp_OACreate 创建 OLE 对象实例。 第一个参数为 OLE 对象的程序标识符(ProgID)或类标识符(CLSID)。 第二个参数为返回的对象令牌,必须是数据类型为 int 的局部变量,在后面的方法中都要用到对象令牌。输出参数,...
  • OLE excel

    千次阅读 2013-10-25 22:06:03
    最全的OLE操作Excel的完整代码(转载) - [技术文档] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://wsqj.blogbus.com/logs/32271364.html #include #include "Excel_...
  • 注意:默认情况sqlserver2008是禁止调用ole自动存储过程的,解决方法如下: sp_configure 'show advanced options',1 go reconfigure go sp_configure 'ole automation procedures',1 go reconfiugre go...
  • .net 调用Oracle存储过程

    千次阅读 2014-03-07 12:38:04
    在.NET中调用Oracle9i存储过程可以用多个数据提供者,比如OralceClient,OleDb。本文将用OralceClient为例。.NET语言用C#。   一、调用一个带输入、输出参数的存储过程 首先,在Oralce中创建存储过程如下: create ...
  • CREATE PROCEDURE创建存储过程存储过程保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用...
  • 3、OLE存储  3.1 OLE存储(OLEstorage)的概念  OLE存储(OLEstorage)是OLE数据的一个仓库,存储...保存OLE存储中数据称作OLE流(OLE stream),OLE流同OLE对象的关系就象文件同目录的关系。含有OLE对象的存储
  • OLE接口详解

    千次阅读 2012-07-04 13:48:02
    所有 OLE Api 和接口的目的 本页 摘要 详细信息 常规 初始化和内存管理 远程处理 自定义服务 服务注册 DLL 服务器管理 杂项 COM 函数 ...
  • 存储过程

    2008-02-21 18:43:00
    目录1.sql存储过程概述2.SQL存储过程创建3.sql存储过程及应用4.各种存储过程使用指南5.ASP中存储过程调用的两种方式及比较6.SQL存储过程在.NET数据库中的应用7.使用SQL存储过程要特别注意的问题1.sql存储过程概述在...
  • OLE DB 源

    千次阅读 2013-09-12 17:40:39
    SQL Server 2012 其他版本 SQL Server 2008 R2 SQL Server 2008 ...OLE DB 源通过使用数据库表、视图或 SQL 命令,从各种兼容 OLE DB 的关系数据库中提取数据。 例如,OLE DB 源可以从 M
  • sql存储过程

    千次阅读 2012-06-03 18:58:30
    1.sql存储过程概述 2.SQL存储过程创建 3.sql存储过程及应用 4.各种存储过程使用指南 5.ASP中存储过程调用的两种方式及比较 6.SQL存储过程在.NET数据库中的应用 7.使用SQL存储过程要特别注意的问题     1....
  • 学习存储过程

    2009-08-14 14:10:00
    CREATE PROCEDURE 创建存储过程存储过程保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用...
  • 远程服务器上的OLEDB连接字符串问题现状:在SharePoint网站链接到ACCDB我OLEDB打开它,程序运行在本地生成的表/列/数据类型和复制数据的ACCESSDB文件类型的本地副本。问题:当我接受我的解决方案并尝试将其部署到...
  • CREATE PROCEDURE创建存储过程存储过程保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用...
  • 存储过程语法

    2006-10-18 21:17:00
    CREATE PROCEDURE创建存储过程存储过程保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用...
  • 存储过程教程

    千次阅读 2014-03-19 11:48:44
    1.sql存储过程概述 2.SQL存储过程创建 3.sql存储过程及应用 4.各种存储过程使用指南 5.ASP中存储过程调用的两种方式及比较 6.SQL存储过程在.NET数据库中的应用  7.使用SQL存储过程要特别注意的问题 1.sql...
  • 系统存储过程

    2019-07-05 03:05:40
    在 Microsoft® SQL Server™ 中,许多管理和信息活动可以通过系统存储过程执行。系统存储过程按这些分类分组。 分类 描述 Active Directory 过程 用于在 Microsoft Windows® 2000 Active Directory™ 中...
  • 存储过程调用com

    2006-01-06 01:10:00
    如何创建 OLE 自动化对象 (Transact-SQL)创建 OLE 自动化对象 调用 sp_OACreate 创建对象。使用该对象。 调用 sp_OAGetProperty 获取属性值。调用 sp_OASetProperty 将属性设为新值。调用 sp_OAMethod 以调用某个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,580
精华内容 8,232
关键字:

ole自动存储过程