急!!!谁能提供Delphi用Sql-dmo连接sql-server的源代码?(45分)

  • 主题发起人 主题发起人 haiping
  • 开始时间 开始时间
H

haiping

Unregistered / Unconfirmed
GUEST, unregistred user!
谁能提供Delphi用Sql-dmo连接sql-server,的源代码?
我的目的是:用sql-dmo连接sql-server并查找服务器中一数据库是否存在,如不存在,
则建立新的数据库。
 
demo下的例子很好呀
 
acloudy, 你在胡扯什么?
 
sorry,what is sql-dmo? in your means!
 
var
sql_server: variant;
Sql_database: variant;
i: integer;
begin
sql_server := CreateOLEobject('Sqldmo.Sqlserver');
sql_server.LoginSecure := true;
sql_server.logintimeout := 30;
sql_server.autoreconnect := true;
sql_server.ApplicationName := 'printery';
sql_server.connect(servername,uid,pwd);
Sql_database:=createOLEobject('Sqldmo.database');
For I:=1 to Sql_server.Databases('master').Tables.coun do
If uppercase(Sql_server.Databases('master').Tables(I).Name)=Uppercase('gstrSysName') Then
'一段代码,没用的。
end;
但是执行到粗体的时候出错了,高手给个意见?
 
你的代码没有保证数据库服务器是否连接成功!加入下面的代码,验证是否是因为数据库
服务器连接不成功导致出错!问题应该出在 sql_server.connect(servername,uid,pwd);
如果服务器都不能连接成功!当然会出错了!

sql_server.connect(servername,uid,pwd);
if not sql_server.VerifyConnection(SQLDMOConn_Valid) then
begin
raise Exception.Create('连接 SQL OLE Server 时发生错误!');
end;
 
caiqing75, 加这条是为了验证是否连通。其实我的代码中是有的,让我刚才删除了。也就我建立
sql_server,sql_database都已成功,且连接。

但我的目的是取得数据库master中的所有表,看是否有我自建的表存在,
如果没有,则新建。

这段代码是用vb改过来的,但执行不成功。谁来修改一下。
For I:=1 to Sql_server.Databases('master').Tables.coun do
If uppercase(Sql_server.Databases('master').Tables(I).Name)=Uppercase('gstrSysName') Then
'检查是否有我一自建的表存在,如不存在,在建立新的表。
 
没有用过你说的Sql-dmo连接sql-server,我使用如下的方法,其中文件Datapath中的内容为:
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=SQLDBTest;Data Source=SQL_Server
你需要更改DataPath文件中的信息为你自己的SQL Server信息
该例的示例代码下载地址:http://wolfsoft.nugoo.com/srcdetail.asp?flag=2&id=3
单元的内容为:
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB;

type
TDataModule2 = class(TDataModule)
ADOConn: TADOConnection;
ads_Test: TADODataSet;
cmd_Test: TADOCommand;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
FMacineName: string;
FDBName: string;
isServer:Boolean;
public
{ Public declarations }
end;

var
DataModule2: TDataModule2;

implementation

{$R *.DFM}

procedure TDataModule2.DataModuleCreate(Sender: TObject);
procedure ExtractStr(const ConStr: string);
var
s: string;
mPos: Integer;
begin
s := Constr + ';';
with TStringlist.Create do
begin
try
while Pos(';', s) > 0 do
begin
mPos := Pos(';', s);
Add(Copy(s, 1, mPos - 1));
System.Delete(s, 1, mPos);
end;
FMacineName := Values['Data Source'];
FDBName := Values['Initial Catalog'];
finally
Free;
end;
end;
end;

function DBExists: Boolean;
begin
with ads_Test do
begin
Close;
CommandText := 'SELECT * FROM sysdatabases WHERE name = ''' + FDBName + '''';
Open;
if isEmpty then
Result := False
else
Result := True;
end;
end;

function CreateSQLServerDB: Boolean;
begin
cmd_Test.CommandText := 'Create database ' + FDBName;
try
cmd_Test.Execute;
Result := True;
except
Result := False;
end;
end;
var
TableSt: TStrings;
sfile: string;
begin
SCreen.Cursor := crHourGlass;
try
TableSt := TStringList.Create;
Sfile := ExtractFilePath(ParamStr(0)) + 'Doc/Datapath';
isServer := False;
if FileExists(sfile) then
begin
TableSt.LoadFromFile(Sfile);
ExtractStr(TableSt.Text);
ADOConn.ConnectionString := 'Provider=SQLOLEDB.1;Persist Security Info=False;' +
'User ID=sa;Initial Catalog=master;Data Source=' + FMacineName;
ADOConn.Connected := True;
if not DBExists then
if not CreateSQLServerDB then
begin
Application.MessageBox('数据库创建失败!', '系统信息', 0);
Exit;
end;
ADOConn.Connected := False;
ADOConn.ConnectionString := TableSt.Text;
isServer := True;
end
else
begin
//如果没有Datapath文件,处理自己的过程,可以连接到别的数据库
end;
try
ADOConn.Connected := True;
except
Application.MessageBox('数据库连接失败!', '系统信息', 0);
Exit;
end;
//在这里可以添加创建表格的Statement
finally
Screen.Cursor := crDefault;
end;
end;
end.
 
我没做过这种方法的链接,
不过既然可能以CreateOLEobject,你就可以用VB的对象浏览器看看这里面有些什么对象,什么方法和属性。
 
我用下面代码以执行:
procedure TForm1.Button1Click(Sender: TObject);
var
sql_server:sqlserver;
sql_database:database;
i:integer;
begin
sql_server:=cosqlserver.Create;
sql_server.LoginSecure:=true;
sql_server.LoginTimeout:=-1;
sql_server.Connect('welcome','sa','yuliqin');
sql_database:=codatabase.Create;
for i:=1 to sql_server.Databases.Count do
begin
sql_database:=sql_server.Databases.Item(i,null);
listbox1.Items.Add(sql_database.Name)
end;
显示所有数据库,但如果数据库名带有下划线,则出错,提示未找到数据库。
请求高手继续讨论。
 
想问一个问题就是你非要用sql-dom来做吗?
对查一个数据库是否存在,sqlserver本身就有相关的库信信息
 
....sql-dom是一个什么好的技术呀?主要是什么时候应用呀?
不是ADO+SQL2000是比较好的选择吗?为什么用SQL-dom呀
 
多人接受答案了。
 
后退
顶部