SQL Server 问题?(70分)

  • 主题发起人 主题发起人 lwluser
  • 开始时间 开始时间
L

lwluser

Unregistered / Unconfirmed
GUEST, unregistred user!
两台机器用网卡对连,一台装了SQL Server 2000 ,另一台怎样才能访问SQL Server中的
数据,如果在没有安装SQL Server 的这台机器上用Delphi开搞开发,Delphi应该怎样
连接到SQL Server?
 
用adoconnection、database控件连接另一台机器的数据库。
 
我用sa登录时提示服务器不存在或拒绝访问,用在企业管理器添加的用户登录还是一样,ODBC连接测试时连接失败?
连接不到SQL Server adoconnection、database也不行啊?
 
利用Delphi中的ADO面板上的控件就可以,很多书上都有例子,找来看看
 
ADO OR BDE都可以
 
你用的是什么认证方式!用ADO或ODBC,ADO is recommended
 
用ado就可以啊。用connection连接到sql server就没问题了啊,把登陆验证去掉
 
你在SQLserver里面设置的身份验证是什么?
是SQLserver和windows都可以还是只能用windows?
 
有可能是你两台机器连接有问题
 
不知道怎么了,SQL Server 身份验证只能设为 WINDOWS only
 
你可以在没有安装SQLSERVERDE的机器上使用ado控件访问sqlserver,但必须安装sqlserver
的客户端,或则通过三层模式midas访问,这样就不用安装sqlserver客户端


 
zhengbo?你是谁,不过我同意你的说法,补充一点,三层时,
在System or System32(2000)下必须把Midas.dll拷到此目录下。
 
很可能是你两台机器连接有问题
 
在客户机上进入client network设置,添加一个pipe到sql server服务器
 
首先要保证你的机器之间可以ping通。其实开发SQL Server的应用一般只用一台机器就够了

下面是三种连接方法:
一.如果用ODBC来连接

1)打开控制面版中的ODBC图标
2)单击用户DSN (user DSN)或者系统DSN(System DSN)标签,再单击按钮,
在弹出的对话框中列表框中找到SQL Server驱动程序,选中后单击完成(或close)按钮,
然后输入输入数据源的名字 Name: myname
描述(description)可不输入内容.
再输入SQL server服务器名(Server): YouServerName
注意: 本地sql server服务器可输入 . 或 (local)即可
以后的步骤是有提示的, 自己按提示进行即可,若有问题请反复摸索。

按完成->用户DSN (user DSN)或者系统DSN(System DSN)标签就多了你刚输入的
myname 这一个dsn(data source name)了。
在delphi 的BDEadministrator 或者 SQL explorer中就多了一点别名:myname
你就可以在程序使用此别名了。
2.SQL server 7 有桌面版,Sql server 2000有个人版,都可以安装在
非NT server平台,比如:win98, nt4 workstation, win2000 professional中。

如果数据库不复杂的话(无存储过程,触发器等),你也可以先用dbf, paradox或
access设计好后,当然要设别名(alias name),最后用datapump将dbf, paradox或
access的库内容倒入SQL server 中, 最后只要用odbc建的Dsn的名字用dbf等库的
别名相同,即可用了。

3.程序中当然什么都可以用,请多学习吧
若用ado连接sql server ,可以不必设置ODBC(也可以设,多此一举了),
说来话长,到此为此。
That's all!



二.如果用别名连接:
SQL server别名,一是可以用MS SQL来创建
二是可以用ODBC来创建
1、采用ODBC连接。首先配置ODBC的‘系统DSN’中建立DATASOUCES, 按提示一步步走即可。
然后在BDE中建立别名,其中:'DATA DSN'为你刚建立的datasouces的名字,一切OK!

2、通过BDE直接连接。首先创建别名,别名类别为‘MSSQL’,然后在‘database name’
中选择你所要连接的ms sql server数据库的名字, 可在user name中输入指定用户名,
当然SQL server中已建。按右键‘APPLY’。一切OK!


三.如果用ADO来连接:
注意ADO 面板中有ADOConnection , ADODataSet, ADOTable, ADOQuery
这四个控件,它们都有connectionstring 属性,将这四个控件中任何一个
放在一个窗体上或DataModule中,
1)双击connectionstring 属性,再单击Build按钮
2)在Provider面板中选中 Microsoft OLE DB Provider for SQL Server
3)再单击Next按钮则进入Connection, 再在其中输入SQL Server的服务器名(Sever Name),
输入Login ID 及password, 然后选择输入你要连接上的DataBase,之后单击
Test Connection按钮, 若本步输入无误的话,将提示你测试成功!
4)多次按 确定或OK 按钮退出即可。
5)若用ADOConnection1已经连接成功,也可直接将其它三个控件的Connection
属性中直接设置为ADOConnection1,它们即可使用,
另外,ADODataSet, ADOTable, ADOQuery与普通的Table和Query用法相同

最后,您就成功了!

源代码,请到 http://delphi_bbs.myetang.com/ 下载离线浏览器的源代码,
比如: DWRich.zip 或 RichBrow.zip 或 richreader2000.07.zip,这些都
是高手写的程序哦,好好研究吧。
注意:尽管这些源程序是用于Access的,但只要你照前面的办法连接上SQL
Server,其它的用法都一样。

 
这是ODBC方式下连接SQL server 和access的源代码:

unit CreateODBC;

interface
uses
Windows, SysUtils, Registry;

Function CreateSQLServerDsn(const FDSN,FServer,FUser:String):Integer;
Function CreateAccessDsn(const myDSN, strFileName:String):string;
Function CreateAccessUserDsn(const myDSN, strFileName:String):string;

implementation

Function CreateSQLServerDsn(const FDSN,FServer,FUser:String):Integer;
var
RegisterTemp:TRegistry;
s : string;
begin
RegisterTemp:=TRegistry.Create;
with RegisterTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;
//首先判断此DSN是否已经存在,如在,则不用继续下去
if OpenKey('Software/ODBC/ODBC.INI/'+FDSN,False) then
begin
CloseKey;
Result:=0;
Free;
exit;
end;
CloseKey;
//判断SQL Server的驱动程序是否已经安装
If OpenKey('Software/ODBC/ODBCINST.INI/ODBC Drivers',False) then
begin
s:=ReadString('SQL Server');
if UpperCase(S)<>'INSTALLED' then
begin
CloseKey;
Result:=2;
Free;
exit;
end;
end
else
begin
CloseKey;
Result:=3;
Free;
exit;
end;
CloseKey;
//寻找SQL Server的驱动程序路径
If OpenKey('Software/ODBC/ODBCINST.INI/SQL Server',False) then
begin
s:=ReadString('Driver');
if S='' then
begin
CloseKey;
Result:=2;
Free;
exit;
end;
end
else
begin
CloseKey;
Result:=2;
Free;
exit;
end;
CloseKey;
//注册一个DSN名称
If OpenKey('Software/ODBC/ODBC.INI/ODBC Data Sources',True) then
WriteString(FDSN,'SQL Server')
else
begin
CloseKey;
Result:=1;
Free;
exit;
end;
CloseKey;
if OpenKey('Software/ODBC/ODBC.INI/'+FDSN,True) then
begin
WriteString('Driver',S);
WriteString('LastUser',FUser);
WriteString('Server',FServer);
Result:=5;
end
else
begin
CloseKey;
Result:=1;
Free;
exit;
end;
CloseKey;
Free;
end;

end;

// Result:=0;
// Result:='此ODBC 的DSN已经存在,创建失败';
// Result:=3;
// Result:='操作系统中ODBC驱动程序没有安装,请检查控制面板的ODBC设置是否存在?';
// Result:=2;
// Result:='Access的ODBC驱动程序没有安装';
// Result:=1;
// Result:='ODBC驱动程序没有安装';
// result :=5;
// result :='成功' ;

Function CreateAccessDsn(const myDSN, strFileName:String):string;
var
registerTemp : TRegistry;
bData : array[ 0..0 ] of byte;
begin
registerTemp := TRegistry.Create; //建立一个Registry实例
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;//设置根键值为HKEY_LOCAL_MACHINE

//找到Software/ODBC/ODBC.INI/ODBC Data Sources
if OpenKey('Software/ODBC/ODBC.INI/ODBC Data Sources',True) then
begin //注册一个DSN名称
WriteString( myDSN, 'Microsoft Access Driver (*.mdb)' );
end
else
begin//创建键值失败
Result :='增加ODBC数据源失败';
exit;
end;
CloseKey;

//找到或创建Software/ODBC/ODBC.INI/MyAccess,写入DSN配置信息
if OpenKey('Software/ODBC/ODBC.INI/'+MyDSN,True) then
begin
WriteString( 'DBQ', strFileName);//数据库目录
WriteString( 'Description', '我的新数据源' );//数据源描述
WriteString( 'Driver', 'C:/PWIN98/SYSTEM/odbcjt32.dll' );//驱动程序DLL文件
WriteInteger( 'DriverId', 25 );//驱动程序标识
WriteString( 'FIL', 'Ms Access;' );//Filter依据
WriteInteger( 'SafeTransaction', 0 );//支持的事务操作数目
WriteString( 'UID', '' );//用户名称
bData[0] := 0;
WriteBinaryData( 'Exclusive', bData, 1 );//非独占方式
WriteBinaryData( 'ReadOnly', bData, 1 );//非只读方式
end
else//创建键值失败
begin
Result :='增加ODBC数据源失败';
exit;
end;
CloseKey;

//找到或创建Software/ODBC/ODBC.INI/MyAccess/Engines/Jet
//写入DSN数据库引擎配置信息
if OpenKey('Software/ODBC/ODBC.INI/'+MyDSN+'/Engines/Jet',True) then
begin
WriteString( 'ImplicitCommitSync', 'Yes' );
WriteInteger( 'MaxBufferSize', 512 );//缓冲区大小
WriteInteger( 'PageTimeout', 10 );//页超时
WriteInteger( 'Threads', 3 );//支持的线程数目
WriteString( 'UserCommitSync', 'Yes' );
end
else//创建键值失败
begin
Result :='增加ODBC数据源失败';
exit;
end;
CloseKey;

Result :='增加新ODBC数据源成功';
Free;
end;

end;

Function CreateAccessUserDsn(const myDSN, strFileName:String):string;
var
registerTemp : TRegistry;
bData : array[ 0..0 ] of byte;
begin
registerTemp := TRegistry.Create; //建立一个Registry实例
with registerTemp do
begin
// RootKey:=HKEY_LOCAL_MACHINE;//设置根键值为HKEY_LOCAL_MACHINE
RootKey:=HKEY_Current_USER;//设置根键值为HKEY_LOCAL_MACHINE

//找到Software/ODBC/ODBC.INI/ODBC Data Sources
if OpenKey('Software/ODBC/ODBC.INI/ODBC Data Sources',True) then
begin //注册一个DSN名称
WriteString( myDSN, 'Microsoft Access Driver (*.mdb)' );
end
else
begin//创建键值失败
Result :='增加ODBC数据源失败';
exit;
end;
CloseKey;

//找到或创建Software/ODBC/ODBC.INI/MyAccess,写入DSN配置信息
if OpenKey('Software/ODBC/ODBC.INI/'+MyDSN,True) then
begin
WriteString( 'DBQ', strFileName);//数据库目录
WriteString( 'Description', '我的新数据源' );//数据源描述
WriteString( 'Driver', 'C:/PWIN98/SYSTEM/odbcjt32.dll' );//驱动程序DLL文件
WriteInteger( 'DriverId', 25 );//驱动程序标识
WriteString( 'FIL', 'Ms Access;' );//Filter依据
WriteInteger( 'SafeTransaction', 0 );//支持的事务操作数目
WriteString( 'UID', '' );//用户名称
bData[0] := 0;
WriteBinaryData( 'Exclusive', bData, 1 );//非独占方式
WriteBinaryData( 'ReadOnly', bData, 1 );//非只读方式
end
else//创建键值失败
begin
Result :='增加ODBC数据源失败';
exit;
end;
CloseKey;

//找到或创建Software/ODBC/ODBC.INI/MyAccess/Engines/Jet
//写入DSN数据库引擎配置信息
if OpenKey('Software/ODBC/ODBC.INI/'+MyDSN+'/Engines/Jet',True) then
begin
WriteString( 'ImplicitCommitSync', 'Yes' );
WriteInteger( 'MaxBufferSize', 512 );//缓冲区大小
WriteInteger( 'PageTimeout', 10 );//页超时
WriteInteger( 'Threads', 3 );//支持的线程数目
WriteString( 'UserCommitSync', 'Yes' );
end
else//创建键值失败
begin
Result :='增加ODBC数据源失败';
exit;
end;
CloseKey;

Result :='增加新ODBC数据源成功';
Free;
end;

end;

end.


调用方法如下:
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
i :=CreateSQLServerDsn(trim(Edit1.Text), trim(Edit3.Text),trim(Edit4.Text));
if i= 5 then
ShowMessage('成功');
if i= 0 then
ShowMessage('失败:'+IntToStr(i));

end;

procedure TForm1.Button2Click(Sender: TObject);
var
strTemp : string;
begin
strTemp:=CreateAccessUserDsn(trim(Edit1.Text), trim(FileNameEdit2.Text));
ShowMessage(strTemp);

end;

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
FileNameEdit2.Visible :=false;
Edit3.Visible :=true;
Edit4.Visible :=true;
Label2.Visible :=false;
Label3.Visible :=true;
Label4.Visible :=true;
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
FileNameEdit2.Visible :=true;
Edit3.Visible :=false;
Edit4.Visible :=false;
Label2.Visible :=true;
Label3.Visible :=false;
Label4.Visible :=false;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
strTemp : string;
begin
strTemp:=CreateAccessDsn(trim(Edit1.Text), trim(FileNameEdit2.Text));
ShowMessage(strTemp);
end;


 
1)如果要建ODBC, 请用unit CreateODBC中的代码
调用函数Function CreateSQLServerDsn(const FDSN,FServer,FUser:String):Integer;就行了
这种方式是写注册表的, ODBC的DSN在BDE中看到时也就是同名的别名;

2)如果要直接用BDE连接,则请在session.addAlias中要用 MSSQL 而不是 SQL Server
这种方式用的是delphi提供的连接sql server方式, 是直接在BDE中建立别名, 而
与ODBC设置无关
下面再给你一段代码, 这是在BDE建立SQL server的别名的办法。

var
GetAlias: TStringList;
ServerStr: String;
begin
serverStr:='MyServer'; //你的sql server所在的服务器的名称, 也可用IP地址
//建立别名
GetAlias:=TStringList.Create;
Session.GetAliasNames(GetAlias); //取得别名列表。
if GetAlias.IndexOf(AliName)<>-1 then
begin
Session.DeleteAlias(AliName);
Session.SaveConfigFile;
end;
try
Session.AddStandardAlias(AliName,'','MSSQL');
Session.SaveConfigFile;
//modify para
GetAlias.Clear;
GetAlias.Add('User name=sa');
GetAlias.Add('SQLQRYMODE=SERVER');
GetAlias.add('Server name='+ServerStr);
GetAlias.add('DataBase name=XXXyz');
Session.ModifyAlias(AliName,GetAlias);
Session.SaveConfigFile;
with DataBase1 do
begin
Connected:=False;
LoginPrompt:=False;
AliasName:=AliName;
DatabaseName:='XXX_SQL';
Params.Clear;
Params.Add('User Name=sa');
Params.Add('Password=');
Connected:=True;
LoginDB:=True;
end;
except
Application.MessageBox('系统建立目标失败,请确定服务器已运行。','错误',MB_ICONERROR+mb_OK);
Application.Terminate;
end;
 
接受答案了.
 
后退
顶部