ADO+SQL Server,快来抢分(100分)

  • 主题发起人 主题发起人 clyin
  • 开始时间 开始时间
C

clyin

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ADO+SQL Server, SQL Server的最大连接数为20,
我创建连接->打开连接->关闭连接,反复20次后,就无
法再连接了(系统报错以达到最大连接数),难道调用
Close无法关闭连接吗?

代码如下:


int main(int argc, char* argv[])
{
char lpstrConn[] = "Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=dbname;Data Source=servername";
_ConnectionPtr conn;
int count = 1;
::CoInitialize(NULL);
conn.CreateInstance(__uuidof(Connection));
for (int i = 0; i < 100; i++) {
try {
conn->Open((_bstr_t)lpstrConn, (_bstr_t)"sa", (_bstr_t)"", adConnectUnspecified);
conn->Close();
}
catch(_com_error &amp;e) {
printf("ado error: %s/n", (LPCSTR)e.Description());
}
}
::CoUninitialize();
return 0;
}

用Delphi试了以下,也是这样。Help!!!!!!!!

 
adoconnection的connected:=false;
 
这个问题我自己解决了,谢谢千中元兄,不过你的方法可不灵。
分怎么给呢?
这样吧,为了分给的更有意义,大家再帮我回答一个问题,答对者立即给分。如下:
在Unit1中定义一个类TA,在Unit2中定义一个类TB,TA包含一个类型为TB的成员B,
TB包含一个类型为TA的成员A,请问这两个单元改如何写,两个单元如何互相引用?

 
老兄,
你也太不够意思了吧,怎么解决的有人可是听着呢
 
对呀!你是怎么解决的?
 
int main(int argc, char* argv[])
{
char lpstrConn[] = "Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=dbname;Data Source=servername";
_ConnectionPtr conn;
int count = 1;
::CoInitialize(NULL);

for (int i = 0; i < 100; i++) {
try {
conn.CreateInstance(__uuidof(Connection));
while (conn->State == adStateConnection) {};
conn->Open((_bstr_t)lpstrConn, (_bstr_t)"sa", (_bstr_t)"", adConnectUnspecified);
conn->Close();
}
catch(_com_error &amp;e) {
printf("ado error: %s/n", (LPCSTR)e.Description());
}
}
::CoUninitialize();
return 0;
}
 
在TB UNIT中要引用TA UNIT时
USES语句要写在IMPLEMENTATION中,
不要写在INTERFACE中.

implementation
uses ta;
 
to clyin:

第二个问题不可解,以前讨论过,只能写在一个unit中,
--delphi的“唯一”缺陷 :-(
 
试试:
在Unit1中引用TB: ‘USES Unit2’语句写在INTERFACE中,
在Unit2中引用TA: ‘USES Unit1’语句写在IMPLEMENTATION中。
 
如果需要循环调用单元,那呒至少有一个单元的USES
应写在IMPLEMENTATION中,这样可以避免循环调用.

我是在别处看到的,没有试过.
我想也是有道理的,IMPLEMENTATION中是单元私有对象,
应该与INTERFACE中不冲突.
 
jacer和yunshang说得是一个意思,但解决不了问题,因为两个类都有类型为对方的成员,
如果不在Interface部分引用,编译就通不过,(类未定义)。
难道真的象温柔一刀说得无解吗,那这可不是一个小缺陷,硬要把两个类写在一个单元
中,实在有违代码重用的原则。
 
我简单试了一下,没问题.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
QuickRpt, ExtCtrls, Qrctrls, StdCtrls,Unit2;

type
TForm1 = class(TForm)
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;

implementation

{$R *.DFM}
end.

而在UNIT2中:
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm2 = class(TForm)
Edit1: TEdit;
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form2: TForm2;

implementation

{$R *.DFM}
uses unit1;

end.

这样编译通过.如果把UNIT2中的uses unit1放到
INTERFACE中去,编译出错:"在UNIT2中循环参照"

 
to yunshang:
你在TForm1的public部分加入Form2: TForm2;
在TForm2地public部分加入Form1: TForm1;
编译要能通过,分全给你,再加100。

 
这样做行不行:
在TForm1的PUBLIC中定义:Form2:TForm;
在IMPLEMENTATION中定义:Form2_bak:TForm1;
然后在程序中的适当位置将Form2_bak赋给Form2:Form2:=Form2_bak;
因为TForm1是从TForm那继承来的,这呒赋值应该没问题.
 
多人接受答案了。
 
后退
顶部