<font color=red>11月25日结束这个问题,200分</font> sql server数据库的复制问题,<font

  • 主题发起人 主题发起人 千中元
  • 开始时间 开始时间

千中元

Unregistered / Unconfirmed
GUEST, unregistred user!
<font color=red>11月25日结束这个问题,200分</font> sql server数据库的复制问题,<font color=red>不是简单的复制</font>,大家踊跃发言,最后如果实现的话会<font color=red>共享</font>的(200分)<br />第一步:(已经完成)
用 delphi程序将光盘上的数据库(该产品要用到的),copy到sql server的data目录。
第二步:(在想该在怎么做)
用 delphi写代码实现sp_attach的功能,也就是注册数据库。
现在没有这个数据库,当然无法用 数据集控件连接。。。。

 
>现在没有这个数据库,当然无法用 数据集控件连接。。。。
不需要连到制定表呀,连数据库就可以了,如果连数据库也没有,需要创建。

qry := tadoquery.create(application);
with qry.sql,qry do
begin
connection := adoconn1;
clear;
Add('sp_attach ....' + ...);
execsql;
free;
end;
 
SQL Server 连接不一定非要连接到某个 Database ,只是默认打开哪个 Database 。
你完全可以连接到 Sql Server ,打开 Master, Master 总是有的,然后用 TQuery 执行
SP_Attatch_DB 就可以了。
 
还有四天时间。
关键是现在这个程序如果和硬件剥离后,
》connection := adoconn1;
user Id我可以用个sa,可是data source如何得到呢?应该是个api得到本机名字
就ok,这个api是。。。。?
 
是不是需要动态创建 ODBC DSN ?
看这里:<a href="DispQ.asp?LID=259651">如何在程序里动态改变 ODBC DSN 指向的 Access 数据库文件?</a>
 
现在计算机名已经解决(以后再说怎么解决)。不是动态建立odbc dsn
在程序中给connectionstring值,
adoQuery1.connectionstring:='Provider=SqlOleDB.1; Persist Security Info=false;
User ID=sa,Intitial Catalog=Marketplace; Data Source=software1-1';
其中Persist Security Info=false或者Persist Security Info=true 有什么区别?
 
前面的问题已经解决:)
现在在调用存储过程的时候出点问题。strdata1和strlog分别为两个设备的路径。
strdata1:=strdata+'/community.mdf';
strlog:=strdata+'/community.ldf';
with adoquery1 do
sql.Add('sp_attach_db @dbname = N''community'',');
sql.add('@filename1 = N''');
sql.add('strdata1');
sql.add(',');
sql.add( '@filename2 = N''');
sql.add('strlog');
错误:Lin6:Incrrect Syntax near 'Strlog'.
好象还是我的pascal基本语法不过关。这可是这个问题的最后部分了,呵呵,大家和我一起努力
了。
 
你执行的命令是下面的,是什么意思呢,单引号怎么不配对的:

sp_attach_db @dbname = N'community',
@filename1 = N'
strdata1
,
@filename2 = N'
strlog

乱七八糟(我也不懂sqlserver,问我看来是问错了)
 
假设库名是voogiya,执行下列语句:
EXEC sp_detach_db @dbname = 'voogiya'
EXEC sp_attach_single_file_db @dbname = 'voogiya',
@physname = 'c:/mssql7/data/voogiya_data.mdf'
给分吧!
 
STRLOG旁边有个非法的关键字,你可以跟踪到这一步,看看你的SQL.TXT,分析分析。
 
哎,sql中建立一个database以后应该是在pubs,sys...等几个系统数据库中修改了很多东西
可以用powerbuilder来看看。他的数据库的分析工具比delphi好。
 
strdata1:=strdata+'/community.mdf';
strlog:=strdata+'/community.ldf';
with adoquery1 do
sql.Add('sp_attach_db @dbname = N''community'',');
sql.add('@filename1 = N''');
// <font color = #ff0000><strong>sql.add('strdata1');</font></strong>
<strong>sql.add(strdata1+'''');</strong>
sql.add(',');
sql.add( '@filename2 = N''');
// <font color = #ff0000><strong>sql.add('strlog');</font></strong>
<strong>sql.add(strlog+'''');</strong>
 
procedure TFrmMain.Button1Click(Sender: TObject);
var
reg: TRegistry;
strPath :String;
strdata,strdata1,strlog:String;
ComputerName:array[0..199] of char;
Size:Dword;
StrComputername:String;
begin
reg :=Tregistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.KeyExists('Software/Microsoft/MSSQLServer/Setup')=false then
begin
showmessage('请在使用本软件前安装sql server');
exit;
end;
reg.OpenKey('Software/Microsoft/MSSQLServer/Setup',False);
strPath :=reg.ReadString('SQLPath');
// strDPath :=reg.ReadString('SQLDataRoot');
// showmessage(strPath);
strdata:=strPath+'/data';
// showmessage(strdata); //所查找到的data目录
//showmessage(strDpath);
reg.CloseKey;
reg.free;
strdata1:=strdata+'/community.mdf';
strlog:=strdata+'/community.ldf';
// 以下要调用一个方法来实现copy data到当前sql server 的data目录下面。
if not Copyfile(Pchar(ExtractFilepath(paramstr(0))+'/data/community.mdf'),pchar(strdata+'/community.mdf'),false)
then
begin
Messagebox(handle,'拷贝数据库时候出现错误,即将退出','错误',MB_OK+MB_ICONERROR);
Exit;
end;
if not Copyfile(Pchar(ExtractFilepath(paramstr(0))+'/data/community.ldf'),pchar(strdata+'/community.ldf'),false)
then
begin
Messagebox(handle,'拷贝数据库时候出现错误,即将退出','错误',MB_OK+MB_ICONERROR);
Exit;
end;
size:=199;
if GetComputerName(Computername,size) then
begin
StrComputerName:=StrPas(ComputerName);
//showmessage(strcomputerName);
end
else
begin
MessageBox(handle,'可能由于该计算机名字过长等原因,未能得到该计算机的名字,即将退出','错误',Mb_OK+MB_ICONERROR);
Exit;
end;
//开始设置connectionstring
adoquery1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source='+strComputerName;
with adoquery1 do
begin
sql.Clear;
sql.Add('sp_attach_db ''community'',');
// sql.add(' N''');
sql.add(''''+strdata1+'''');
sql.add(',');
// sql.add( 'N''');
sql.add(''''+strlog+'''');
execsql;
showmessage('已经安装成功');
end;
 
特别感谢Wrench 在oicq上提供的技术支持:)
 
完了,还说给我1/3的版权,
这一咋呼,我连百他之一也分不到了
:-(
 
用storeprocedure特简单。"%#@$#",盖世的老千
 
嗨!
老千呀!
不要使用adoquery,都换成 ADODataSet 。
致于为何?
这是密秘。
:-)
 
后退
顶部