各位高手,大家好。关于用代码附加sqlserver2000数据库的问题

goj2000 2004-04-18 10:00:01
各位高手,大家好。不好意思,再向大家请教一个问题,请在百忙之中给予解答。
我想用代码实现SQLSERVER2000的数据库附加,但要用adodb.connection的execute执行sp_attach_db 时,必须先把该连接打开,如:
db.Open "PROVIDER=MSDASQL;dsn=aaa;uid=xxx;pwd=xxx;"
但此时,系统中并没有任何可供连接到sqlserver2000的odbc,应该怎么办?
...全文
46 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
射天狼 2004-04-19
'连接 SQL ANYWHERE 数据库
'cn.ConnectionString = "Driver={Sybase SQL Anywhere 5.0};DatabaseFile=" & App.Path & "\数据库\Refer.DB;DatabaseName=Refer;UID=dba;PWD=sql;AutoStop=yes;Agent=engine;Start=" & App.Path & "\数据库\dbeng50.exe -Q"
cn.ConnectionString = "DSN=refer;UID=dba;PWD=sql"

'连接 SYBASE 数据库
cn.ConnectionString = "Driver={Sybase System 11};SRVR=Cuizm;DATABASE=ResManage;UID=sa;PWD=admind"

'连接 SQL SERVER 数据库
'cn.ConnectionString = "Driver={SQL Server};SERVER=DataServer;DATABASE=zxzx;UID=information;PWD=information*&#"
cn.ConnectionString = ls_Constring

cn.Open
  • 打赏
  • 举报
回复
goj2000 2004-04-19
谢谢各位大侠,现在就结帖。
  • 打赏
  • 举报
回复
zjcxc 2004-04-19
dim db as new adodb.connection
db.open "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=用户名;Password=密码;Initial Catalog=master;Data Source=SQL服务器名" '指定连接到master数据库,或者不指定数据库名

'附加
db.execute "sp_attach_db '库名','数据文件名','日志文件名'"
  • 打赏
  • 举报
回复
wumy_ld 2004-04-19
'******************************************************************************
' 以下代码判断数据库是否已经附加到当前数据库
' 如果没有,调用SQL命令附加数据库
'*****************************************************************************
Screen.MousePointer = 11

strServer = GetINI(gstrCurrPath & DSNINIFile, "Database", "Server", "?")
If strServer = "?" Then
Screen.MousePointer = 0
MsgBox "服务器信息已被损坏,程序将用缺省值进行修复!", vbExclamation, "提示"
strServer = "(local)"
Screen.MousePointer = 11
End If

Err.Clear
Set con = New ADODB.Connection
con.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=master;Server=" & strServer
con.Open '打开数据库连接
If Err.Number <> 0 Then GoTo ErrMsg

On Error GoTo ErrMsg
strSQL = "select Count(*) from sysdatabases" _
& " where name='" & DatabaseName & "'"
Set rsTemp = New ADODB.Recordset
rsTemp.Open strSQL, con
If rsTemp(0) < 1 Then '第一次运行
'通过代码附加数据库
strSQL = "sp_attach_db @dbname=N'" & DatabaseName & "'," _
& "@filename1='" & gstrCurrPath & DatabaseDir & DatabaseName & "_data.mdf'," _
& "@filename2='" & gstrCurrPath & DatabaseDir & DatabaseName & "_log.ldf'"
con.Execute strSQL
' '添加到日志
' AddLog "第一次运行", "成功附加数据库!", OperationLog
End If
Screen.MousePointer = 0
  • 打赏
  • 举报
回复
csdnmzk 2004-04-18
没看清楚,搞错了,我想你应该先建立一个对sp_detach_db 所在的master表的数据库连接,然后,在vb中调用这个存储过程。
用法:
sp_attach_db
将数据库附加到服务器。

语法
sp_attach_db [ @dbname = ] 'dbname'
, [ @filename1 = ] 'filename_n' [ ,...16 ]

参数
[@dbname =] 'dbname'

要附加到服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname,默认值为 NULL。

[@filename1 =] 'filename_n'

数据库文件的物理名称,包括路径。filename_n 的数据类型为 nvarchar(260),默认值为 NULL。最多可以指定 16 个文件名。参数名称以 @filename1 开始,递增到 @filename16。文件名列表至少必须包括主文件,主文件包含指向数据库中其它文件的系统表。该列表还必须包括数据库分离后所有被移动的文件。

返回代码值
0(成功)或 1(失败)

结果集


注释
只应对以前使用显式 sp_detach_db 操作从数据库服务器分离的数据库执行 sp_attach_db。如果必须指定多于 16 个文件,请使用带有 FOR ATTACH 子句的 CREATE DATABASE。

如果将数据库附加到的服务器不是该数据库从中分离的服务器,并且启用了分离的数据库以进行复制,则应该运行 sp_removedbreplication 从数据库删除复制。

权限
只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行本过程。

示例
下面的示例将 pubs 中的两个文件附加到当前服务器。

EXEC sp_attach_db @dbname = N'pubs',
@filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
@filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'

  • 打赏
  • 举报
回复
csdnmzk 2004-04-18
'建立一个联接数据库的模块
Function IniData() As Boolean

On Error GoTo errh

Dim UserName As String
Dim Password As String
Dim ServerName As String
Dim DBName As String

Set db = New Connection 'db是你声明的数据库联接
If db.State = adStateOpen Then IniData = True: Exit Function

'由INI文件调用服务器名称
Dim inifile As CIniFile
Set inifile = New CIniFile
inifile.SpecifyIni (App.Path & "\sys.ini")
ServerName = inifile.ReadString("system", "ServerName", 255)

'由INI文件调用数据库名称


DBName = inifile.ReadString("system", "DatabaseName", 255)


' Set connection properties.

db.CursorLocation = adUseClient
db.ConnectionTimeout = 25 ' Set the time out.
db.Provider = "sqloledb" ' Specify the OLE DB provider.
db.Properties("Data Source").Value = ServerName ' Set SQLOLEDB connection properties.
db.Properties("Initial Catalog").Value = DBName ' Set SQLOLEDB connection properties.

'如果是WINNT授权登录则用下面语句:
db.Properties("Integrated Security").Value = "SSPI"


' 设置SQL授权登陆'

' db.Properties("User ID").Value = UserName
' db.Properties("Password").Value = Password

' Change mousepointer while trying to open database.
Screen.MousePointer = vbHourglass

' Open the database.
db.Open
IniData = True
Screen.MousePointer = vbDefault
Exit Function
errh:
IniData = False
Screen.MousePointer = vbDefault
MsgBox "数据连接错误!原因如下:" & Chr(13) & Err.Description, vbExclamation + vbOKOnly, "登录"


End Function


'建立一个读取ini文件的类模块:
Private Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal nDefault As Long, _
ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long

Private Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFileName As String) As Long
' 从上面的注释中,我们可以知道,每次调三个 API 之一都需要指定 INI 文件名。而在我们的 CIniFile 的每一个实例中,应该始终访问同一个 INI 文件,所以属性之一就是文件名

Private IniFileName As String

'另外,调用 API 的过程中可能会出现错误,那么 CIniFile 应该能提供错误信息,所以定义一个保存错误信息的变量作为 CIniFile 的第二个属性
Public ErrorMsg As String

' -------------------


'由于访问什么段、什么键以及写入什么值都可以通过参数的形式传递给方法,而获取的值也都可以通过方法的返回值得以,所以不再需要其它属性了。不过在定义方法之前还需要对属性进行初始化:

Private Sub Class_Initialize()
IniFileName = vbNullString
ErrorMsg = vbNullString
hiByte = 0
hiBound = 1024 ' Default buffer size = 1024 bytes (1 Kb)
ReDim byteArray(hiBound)
End Sub

'为了指定 INI 文件名给 CIniFile,需要定义一个方法:

Public Sub SpecifyIni(FilePathName)
IniFileName = Trim(FilePathName)
End Sub
'在每次读写值之前还需要先判断是否已经指定了 INI 文件名,不然读什么写什么啊?

Private Function NoIniFile() As Boolean
NoIniFile = True
If IniFileName = vbNullString Then
ErrorMsg = "没有指定 INI 文件"
Exit Function
End If
ErrorMsg = vbNullString
NoIniFile = False
End Function

'准备工作完成,现在才是重头戏,读写 INI 文件。似乎“写”要简单一些,就先“写”吧:

Public Function WriteString(Section As String, key As String, Value As String) As Boolean
WriteString = False
If NoIniFile() Then
Exit Function
End If
If WritePrivateProfileString(Section, key, Value, IniFileName) = 0 Then
ErrorMsg = "写入失败"
Exit Function
End If
WriteString = True
End Function

'而读 INI 就要稍稍麻烦一点了,两个读取 INI 文件的的函数中,读取字符串那个虽然参数多些,但实现起来却更简单,所以,先写这个:

Public Function ReadString(Section As String, key As String, Size As Long) As String
Dim returnStr As String
Dim ReturnLng As Long
ReadString = vbNullString
If NoIniFile() Then
Exit Function
End If
returnStr = Space(Size)
ReturnLng = GetPrivateProfileString(Section, key, vbNullString, returnStr, Size, IniFileName)
ReadString = Left(returnStr, ReturnLng)
End Function

'最后我们不得不面对这个最麻烦的 ReadInt 方法了。它为什么麻烦呢?看看现在的函数定义就知道了:

Public Function ReadInt(Section As String, key As String) As Long
Dim ReturnLng As Long
ReadInt = 0
ReturnLng = GetPrivateProfileInt(Section, key, 0, IniFileName)
If ReturnLng = 0 Then
ReturnLng = GetPrivateProfileInt(Section, key, 1, IniFileName)
If ReturnLng = 1 Then
ErrorMsg = "不能读取"
Exit Function
End If
End If
ReadInt = ReturnLng
End Function
  • 打赏
  • 举报
回复
goj2000 2004-04-18
最好给出实现的具体代码,一定给分,决不食言。
  • 打赏
  • 举报
回复
相关推荐
发帖
数据库(包含打印,安装,报表)

1200

社区成员

VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
帖子事件
创建了帖子
2004-04-18 10:00
社区公告
暂无公告