2015-06-15 8 views
-2

У меня есть веб-сервис, который я создал с помощью Delphi, и я хочу подключиться к серверу sql с ним, поэтому я добавил в проект ADO Connection и ADOQuery, оба из которых были настроены и готовы к использованию, была только небольшая проблема, в моем проекте есть две единицы, и эти объекты были добавлены в Unit1, и я работаю с моим ImplUnit whitch - это еще одна единица и не может найти способ ссылаться или включать одну единицу внутри другого устройства ,Delphi 7 object undefinedat

блок1

{ SOAP WebModule} 
unit Unit1; 

interface 

uses 
    SysUtils, Classes, HTTPApp, InvokeRegistry, WSDLIntf, TypInfo, 
    WebServExp, WSDLBind, XMLSchema, WSDLPub, SOAPPasInv, SOAPHTTPPasInv, 
    SOAPHTTPDisp, WebBrokerSOAP, DB, ADODB; 

type 
    TWebModule1 = class(TWebModule) 
    HTTPSoapDispatcher1: THTTPSoapDispatcher; 
    HTTPSoapPascalInvoker1: THTTPSoapPascalInvoker; 
    WSDLHTMLPublish1: TWSDLHTMLPublish; 
    ADOConnection1: TADOConnection; 
    ADODataSet1: TADODataSet; 
    ADOQuery1: TADOQuery; 
    procedure WebModule1DefaultHandlerAction(Sender: TObject; 
     Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    WebModule1: TWebModule1; 

implementation 

{$R *.dfm} 

procedure TWebModule1.WebModule1DefaultHandlerAction(Sender: TObject; 
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
begin 
    WSDLHTMLPublish1.ServiceInfo(Sender, Request, Response, Handled); 
end; 

end. 

Мой блок

unit UTImplementacao; 

interface 

uses 
    InvokeRegistry,DB, ADODB; 


type 
    IInterface = interface(IInvokable) 
    ['{EFF30FFA-DA0C-433A-832A-0BA057B55103}'] 
    function ReceiveUser(username : String; password : String) : 
    Boolean; stdcall; 
    end; 



    TImplementacao = class(TInvokableClass, IInterface) 
    public 
    function ReceiveUser(username : String; password : String) : 
    Boolean; stdcall; 
    end; 

implementation 

{ TImplementacao } 

function TImplementacao.ReceiveUser(username, password: String): Boolean; 
var 
ADOConnection1: TADOConnection; 
ADOQuery1: TADOQuery; 
begin 
    try 
     ADOConnection1 := TADOConnection.Create(nil); 
     ADOConnection1.LoginPrompt := False; 
     ADOConnection1.ConnectionString:= 'Provider=SQLOLEDB.1;Integrated Security=SSPI;' + 
             'Persist Security Info=False;' + 
             'User ID=Diego;'+ 
             'Catalog=OnlineShopping;' + 
             'Data Source=DIEGO-PC\SQLEXPRESS'+ 
             ';Use Procedure for Prepare=1;' + 
             'Auto Translate=True;Packet Size=4096;'+ 
             'Workstation ID=DIEGO-PC;'+ 
             'Use Encryption for Data=False;'+ 
             'Tag with column collation when possible=False;'; 
     ADOConnection1.Connected := True; 
     ADOQuery1.Connection := ADOConnection1; 
     ADOQuery1.SQL.Add('select username,upassword from Users '+ 
         'where username = :usernamep and upassword = '+ 
         ':upasswordp'); 
     ADOQuery1.Parameters.ParamByName('upasswordp').Value := password; 
     ADOQuery1.Parameters.ParamByName('usernamep').Value := username; 
     ADOQuery1.ExecSQL; 

     Result := True; 

finally 
    ADOQuery1.Free; 
    if ADOConnection1.Connected then 
    ADOConnection1.Close; 
    ADOConnection1.Free; 
    end; 


Result := False; 

end; 

initialization 
    InvRegistry.RegisterInvokableClass(TImplementacao); 
    InvRegistry.RegisterInterface(TypeInfo(IInterface)); 

end. 

пожалуйста игнорировать ADOConnection и ADOQuery, что я добавил к моему блоку я получил немного отчаянное объявление duplicade кода ... Да, я знаю, yachs !!!!

@SilverWarrior

Если объявить Unit1 внутри использования UTImplementacao я буду иметь доступ к componemts ниже:

type 
    ADOConnection1: TADOConnection; 
     ADODataSet1: TADODataSet; 
     ADOQuery1: TADOQuery; 

или я должен объявить для каждого из типов переменных внутри п вар?

+0

Либо вы не опубликовали фактический код, который используете, или вам нужно уделять больше внимания вашему экрану. В первом из этих файлов есть комментарий с прекращенным завершением. SO делает это легко увидеть в вопросе, также в предварительном просмотре. В Delphi IDE также легко видеть то же самое. Во всяком случае, даже в стороне от этого, для меня практически невозможно понять, что вы пытаетесь спросить.Сделайте шаг назад, посмотрите на свой вопрос и посмотрите, сможете ли вы это понять, если бы кто-то спросил об этом. Если нет, вы можете решить вопрос, чтобы сделать его более понятным. – hvd

+0

Спасибо за быстрый ответ, но чтобы сделать его простым, я хочу создать веб-службу, которая будет подключаться к базе данных SQL Server с помощью Delphi. – user2414726

+0

Это не ваш настоящий код, потому что оба устройства называются 'unit1', и вы не можете иметь две единицы с тем же именем в одном проекте. Когда вы обходитесь, чтобы предоставить реальный код, с которым вы столкнулись, и можете * четко объяснить * проблему, с которой вы сталкиваетесь, [изменить] свой вопрос и сделать это. До тех пор я голосую, чтобы закрыть его как вне темы, потому что вы четко не заявили о проблеме или не включили соответствующий код. –

ответ

1

Если вы хотите получить доступ к объектам, объявленным в Unit1, из других единиц вашего проекта, вам нужно добавить Unit1 в интерфейс, используя раздел (тот, который находится сверху) этих устройств.

unit ImplUnit; 

interface 

uses 
    SysUtils, Classes, ... , Unit1; 

... 

То есть точно так же, как Delphi автоматически добавляет другие единицы, такие как SysUtils, классы и т.д.

Кроме того, я бы настоятельно рекомендую вам изменить имя вашего устройства, чтобы somethng более значимыми, так что, когда вы будете посмотрите на свой код через некоторое время, когда вы быстро узнаете, какой код содержит этот блок и для чего он используется.

EDIT: На основе вашего редактирования вопроса я подозреваю, вы хотите Acces компоненты из вашего группы1 непосредственно по телефону:

Unit1.AdoConnection1 

Это не будет работать. Зачем? Becouse компоненты объявляются в рамках класса .

Так что вам нужно, чтобы получить доступ к ним, как это:

Unit1.WebModule1.AdoConnection1; 

ПРИМЕЧАНИЕ: Если Unit1 добавлен в интерфейс раздел использует ваш UTImplementacao блока вы можете напрямую позвонить:

WebModule1.AdoConnection1 

Вы надеваете» t необходимо префикс каждой команды с помощью Unit1. Я написал это таким образом, чтобы, надеюсь, более понятно, к каким единицам вы обращаетесь. Особенно для других людей, которые могут читать эту тему и не знать структуру вашей программы.

+0

Спасибо за ваш ответ, я сделал это, и до сих пор я не мог использовать объекты внутри unit1. – user2414726

+0

Почему бы и нет? Какая у вас ошибка? – SilverWarior

 Смежные вопросы

  • Нет связанных вопросов^_^