通过.sql文件创建数据库,使用xp_cmdshell

xrongzhen 2010-05-13 04:19:57
通过文件创建数据库,在SQL Server 2000下可以,在SQL Server 2005下却不可以,只能添加上数据库,表却添加不上。不知为什么?


'创建数据库
lblCreate.Caption = "正在创建新的数据库……"
lblCreate.Refresh
strSql = strSql & "CREATE DATABASE [test5] ON PRIMARY(NAME = N'test5_Data', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test5_Data.MDF' , SIZE = 3, FILEGROWTH = 10%) LOG ON (NAME = N'test5_Log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\Data\test5_Log.LDF' , SIZE = 1, FILEGROWTH = 10%)"
Call ExecuteSQL(strSql, 1)'这是一个执行SQL语句的函数 数据库可以创建,说明以上没问题


'执行sql文件
lblCreate.Caption = "正在创建表……"
lblCreate.Refresh
Dim strFile As String
strFile = App.Path + "\test2005.sql"

strSql = "master.dbo.xp_cmdshell 'osql -U " & Trim(txtUserName.Text) & " -P " & Trim(txtPassWord.Text) & " -i """ & strFile & """'"

Dim cn As New ADODB.Connection
cn.Open "Driver={SQL Server};Server=" & Trim(txtServer.Text) & ";Uid=" & Trim(txtUserName.Text) & ";Pwd=" & Trim(txtPassWord.Text)
cn.Execute strSql
cn.Close



--这是test2005.sql文件的内容 是用数据库脚本生成的,加了句Use test5
USE test5
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Table_1]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Table_1](
[id] [nchar](10) NULL,
[text] [nchar](10) NULL
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Table_2]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Table_2](
[id] [nchar](10) NULL,
[name] [nchar](10) NULL
) ON [PRIMARY]
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Table_3]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Table_3](
[id] [nchar](10) NULL,
[sex] [nchar](10) NULL
) ON [PRIMARY]
END



请各位帮忙看一下 当然还有其他好的方法也可以说一下。 不要灌水,呵呵
...全文
221 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2010-05-17
  • 打赏
  • 举报
回复
就像你通过手机给朋友指路一样,直行、左转、右转是以对方的的朝向为基准的。

同样 xp_cmdshell 启动的是服务器上的命令,你必须站在服务器命令行的角度来调用文件,该文件必须是在服务器上可访问的:
a)客户端通过网络共享,让服务端能用 UNC 路径的方式访问该文件。
b)客户端上传文件,这样服务端可以用过(服务端的)本地路径访问文件。
chuifengde 2010-05-17
  • 打赏
  • 举报
回复
ExecuteSQL 这个函数是怎么写的?
xrongzhen 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tiger_zhao 的回复:]
VB code
strFile = App.Path + "\test2005.sql"

在服务器上执行的 osql 命令行,必须是服务器上的文件路径。
[/Quote]

这两天没能上网。不好意思。

不过,Tiger_Zhao怎样才是服务器文件路径呢? 现在我是在本机上运行程序的

xrongzhen 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tiger_zhao 的回复:]
引用 2 楼 guanking 的回复:
建议现在SQL 2005的企业管理器中执行一下建表脚本。看看是否成功?
[/Quote]

拷贝出来 直接执行没问题,但是用程序的话,只能创建数据库,表加不上
Tiger_Zhao 2010-05-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guanking 的回复:]
建议现在SQL 2005的企业管理器中执行一下建表脚本。看看是否成功?
[/Quote]
xrongzhen 2010-05-14
  • 打赏
  • 举报
回复
居然没人,这问题都没遇到过吗?
Tiger_Zhao 2010-05-14
  • 打赏
  • 举报
回复
strFile = App.Path + "\test2005.sql"

在服务器上执行的 osql 命令行,必须是服务器上的文件路径。
贝隆 2010-05-14
  • 打赏
  • 举报
回复
学习。。。。。。。
xrongzhen 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 guanking 的回复:]
建议现在SQL 2005的企业管理器中执行一下建表脚本。看看是否成功?
[/Quote]

脚本当然是可以的,因为在SQL SERVER 2000中执行一点问题也没有
guanking 2010-05-13
  • 打赏
  • 举报
回复
建议现在SQL 2005的企业管理器中执行一下建表脚本。看看是否成功?
xrongzhen 2010-05-13
  • 打赏
  • 举报
回复
有什么好的提议,也请晾一下。谢谢

比较怪的是,在2000下没问题,在2005下却怎么也不行

另外xp_cmdshell已经启用了

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧