技术已荒废

生活的理想,是为了理想的生活!

---->>Nothing is impossible for a willing heart.

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  73 随笔 :: 16 文章 :: 114 评论 :: 1 引用
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

using System.Data;
using System.Data.OracleClient;
using System.IO;

using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
    
private OracleConnection webConnection;
    DataTable curDt 
= new DataTable();
    DataSet curSet 
= new DataSet();
    OracleDataAdapter curDa 
= new OracleDataAdapter();
    OracleCommand curComm 
= new OracleCommand();

    
private string GetCurCnnStr()
    
{
        
//连接数据库并打开
        OracleConnectionStringBuilder cnnStrBuilder = new OracleConnectionStringBuilder();
        cnnStrBuilder.UserID 
= "";
        cnnStrBuilder.Password 
= "";
        cnnStrBuilder.DataSource 
= "";
        
return cnnStrBuilder.ConnectionString;
    }

    
public Service()
    
{

        
//如果使用设计的组件,请取消注释以下行 
        
//InitializeComponent(); 
    }


    [WebMethod(Description 
= "判断空值")]
    
private OracleParameter CreateParam(string ParamName, object ParamValue)
    
{
        OracleParameter Result 
= new OracleParameter();
        Result.ParameterName 
= ParamName;
        
if (ParamValue != null)
        
{
            Result.Value 
= ParamValue;
        }

        
else
        
{
            Result.Value 
= DBNull.Value;
        }


        
return Result;
    }


    [WebMethod(Description 
= "测试连接")]
    
public string Linking()
    
{
        
return "WebService连接成功!";
    }



    [WebMethod(Description 
= "查询信息")]
    
public byte[] Search(string img)
    
{
        
try
        
{
            webConnection 
= new OracleConnection(GetCurCnnStr());
            webConnection.Open();
            
//查询表中的所有的数据
            OracleDataAdapter webAdapter = new OracleDataAdapter("select pic from pic where id=" + img, webConnection);
            DataSet webDataTable 
= new DataSet();
            
//byte[] webDataTable = new byte[0];
            webAdapter.Fill(webDataTable);
            webConnection.Close();

            
//序列化为二进制
            webDataTable.RemotingFormat = SerializationFormat.Binary;//确定序列化格式
            BinaryFormatter bFormatter = new BinaryFormatter();
            MemoryStream mStream 
= new MemoryStream();
            bFormatter.Serialize(mStream, webDataTable);
            
byte[] bytes = mStream.ToArray();//将数据流写入字节数组
            
//返回数组 
            return bytes;

        }

        
catch (Exception)
        
{
            curComm.Transaction.Rollback();
            
return null;
        }

        
finally
        
{
            
            webConnection.Close();
        }

     
    }


    [WebMethod(Description 
= "添加信息")]
    
public void Add(string id, byte[] Image)
    
{
        
try
        
{
            webConnection 
= new OracleConnection(GetCurCnnStr());
            curComm.Connection 
= webConnection;
            webConnection.Open();
            curComm.Transaction 
= webConnection.BeginTransaction();
            curComm.CommandText 
= "insert into pic(id,pic)values(:pId,:pPic)";
            curComm.Parameters.Add(CreateParam(
"pId", (id != null? id : null));
            curComm.Parameters.Add(CreateParam(
"pPic", (Image != null? Image : null));

            curComm.ExecuteNonQuery();
            curComm.Transaction.Commit();


        }

        
catch (Exception)
        
{
            curComm.Transaction.Rollback();
        }

        
finally
        
{
            webConnection.Close();
        }

    }


   
    
}
以上为webservice客户端代码;下面是delphi代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, InvokeRegistry, Rio, SOAPHTTPClient, ExtCtrls, StdCtrls,
  Service,types,jpeg,StrUtils, Buttons;
  
//StrUtils:取指定字符
  {QDialogs:在delphi6及以后的版本中,
  为了支持kylix,能使程序在linux下运行
  每一个单元都增加了对应的QDialogs单元
  如果你用了带Q的单元,哪么如果你的程序
  要想在Windows中正常运行必须得有qtintf.dll
  的支持你可以搜索一个,把程序中uses中的
  单元前有Q的把Q去掉就ok了!   }

type
  TForm1 
= class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Panel1: TPanel;
    Image1: TImage;
    HTTPRIO1: THTTPRIO;
    
Open: TOpenDialog;
    Search: TButton;
    
Add: TButton;
    
Update: TButton;
    
Delete: TButton;
    Panel2: TPanel;
    Image2: TImage;
    Label2: TLabel;
    
procedure SearchClick(Sender: TObject);
    
procedure FormShow(Sender: TObject);
    
procedure Image2Click(Sender: TObject);
    
procedure Edit1KeyPress(Sender: TObject; var KeyChar);
    
procedure Image1Click(Sender: TObject);
    
procedure AddClick(Sender: TObject);
    
procedure DeleteClick(Sender: TObject);
    
procedure UpdateClick(Sender: TObject);

  private
    { Private declarations }
  
public
    { 
Public declarations }
  
end;

var
  Form1: TForm1;
  files:TFileStream;
  ms:TMemoryStream;
  jpg:TjpegImage;
  s:TByteDynArray;
  path:WideString;
implementation

{$R 
*.dfm}

procedure TForm1.SearchClick(Sender: TObject);
var
  bmTemp:TjpegImage;
//TBitmap;
  Web_Search:ServiceSoap;
begin
     bmTemp:
=TjpegImage.Create;
      
//创建流
      ms:
=TMemoryStream.Create;
    Web_Search:
=HTTPRIO1 as ServiceSoap;
   try
      
if (edit1.Text<>''then
          
begin
             
//调用服务查询功能
              s:
=(Web_Search.Search(edit1.Text));
              
if(length(s)<6229)  then
                  
begin
                     showmessage(
'没有图片,请重输');
                     image1.Picture.Assign(nil);
                  
end
              
else
                  
begin
                     
//从图片开始位置读取
                     ms.Write(s
[6229],length(s));
                     ms.Position:
=0;
                     
//加载流
                     bmTemp.LoadFromStream(ms);
                      
//输出
                     image1.Picture.Assign(bmTemp);
                  
end;

            
end
       
else
          
begin
              showmessage(
'缺少查询条件!');
              image1.Picture.Assign(nil);
              edit1.SetFocus;
          
end;
   finally
       
//释放空间
       ms.Free;
       bmTemp.Free;
       
//控制
       
//edit1.Clear;
       edit1.SetFocus;
    
end;

 
end;
procedure TForm1.FormShow(Sender: TObject);
var
    fstyle: dWord;
begin
     
//控制edit只输入数字
     fstyle :
= GetWindowLong(Edit1.Handle, GWL_STYLE);
     SetWindowLong(Edit1.Handle, GWL_STYLE, fstyle 
or ES_NUMBER);
      
//指定图片格式
     edit1.SetFocus;
     
end;

procedure TForm1.Image2Click(Sender: TObject);
var
 Web_link:ServiceSoap;
begin
  
//测试连接
   Web_link:
=HTTPRIO1 as ServiceSoap;
   showmessage(
''+Web_link.Linking+'');
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var KeyChar);
begin
   
//输入控制
   
if key=#13 then
   Search.Click;
end;

procedure TForm1.Image1Click(Sender: TObject);
var
  testpath:string;
  testname:string;
begin
  ms:
=TMemoryStream.Create;
  jpg:
=TjpegImage.Create;
  
if Open.Execute then
     
begin
       testpath:
=ExtractFileName(open.FileName);
       testname:
=RightStr(testpath,4);
       
if (testname='.jpg')or( testname='.JPG'or( testname='.jpeg')or( testname='.JPEG')then
           
begin
              path:
=ExtractFileDir(open.FileName)+'\'+ExtractFileName(open.FileName);
              files:
= TFileStream.Create(open.FileName,fmShareDenyWrite);
              try
                  jpg.LoadFromStream(files);
                  jpg.SaveToStream(ms);
                  image1.Picture.Assign(jpg);
              finally
                  files.Free;
               
end;
            
end
        
else
        showmessage(
'当前默认为JPEG类型图片');
    
end;
end;
end.


 

posted on 2007-04-27 08:55 技术已荒废 阅读(2000) 评论(8) 编辑 收藏

评论

#1楼 2007-04-27 11:41 小朱      
不错,收藏了。
 回复 引用 查看   

#2楼 2007-04-27 14:47 Bo Chen [未注册用户]
前一段有一同事需要从Delphi(Win32)里使用WebService,却不得其门而入,试了两天,不得而终。看了本文才知道原来是这样做的。

不过,后来我给出了一种解决方案,用.Net 的DLL把对WebService的访问包装成传统的DLL,Delphi(Win32)程序只是简单调用一个DLL中的函数来获取WebService的返回值,使得不懂如何直接调用WebService的Delphi程序员一样可以用WebService. 参见:http://bochenlin.spaces.live.com/blog/cns!1AACA2FEF6955170!128.entry
 回复 引用   

#3楼 2007-05-24 11:01 alex[未注册用户]
我使用Delphi调用Java的webservice方法,获取一个Byte[]数组,方法同上面类似,只是在调用“s:=(Web_Search.Search(edit1.Text));”时,客户端程序死了,没有抛出任何异常,请指教,是什么原因导致的这个问题?如何处理呢?万分感谢!
 回复 引用   

#4楼 2007-05-25 09:44 楼主[未注册用户]
楼上的朋友,java偶不会,无能为力拉!
 回复 引用   

#5楼 2007-05-28 13:29 alex[未注册用户]
谢谢楼主的关注,不知道楼主在开发这类型的项目时,是不是从来没有遇到过这种问题?不论数据大小都没问题吗?能否提供一种调试的机制可以查找出现这种问题的原因的方法呢?我现在都不知道该咋处理这个问题了。。。我好急呀!
 回复 引用   

#6楼 2007-05-28 14:13 tianjun[未注册用户]
sorry,我现在没搞这方面技术,不过可以告诉你:当然与数据大小有关系,具体在配置文件中设置webconfig 中,属性和方法可以参考msdn中的相关内容
 回复 引用   

#7楼 2007-07-07 01:06 青蛙[未注册用户]
能不能把DELPHI完整的代码和DFM文件发给我,万分感谢.
cydd007@163.com
 回复 引用   

#8楼 2008-06-10 16:15 5207      
不知道byte[]返回null值,DELPHI调用时会不会出异常????
 回复 引用 查看