用Ado来运行sql脚本(扩展名为sql的文件),有可能吗?

junguo 2002-05-21 07:10:29
欢迎讨论,分不够可以加!
...全文
105 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
junguo 2002-05-22
谢谢大家的帮助,等我把程序写出来。公布给大家的时候,一并结账!
  • 打赏
  • 举报
回复
mfkzj 2002-05-22
当然可以了
SQL脚本有几种类型 你能生成WINDOWS格式的脚本 在这个类型中是以 GO 来区分各个语句 所以你在打开和读取SQL脚本的时候只需要以GO为分隔符来一句一句读取
OK?
其他的执行 就简单了 建立ADO连接以后只需要EXECUTE该SQL如果就可以了 给分 ^_^
  • 打赏
  • 举报
回复
junguo 2002-05-22
small_wei(small) ,谢谢你的帮助。
不过现在我要做的是假设,我机器上没有装sql server的情况!
  • 打赏
  • 举报
回复
junguo 2002-05-22
程序写的不怎么地,不过功能可以完成了,谢谢大家的回答。
LPSTR strSqlScript;
LPSTR strSql;
int CDatabaseCrApp::RunSqlScript(CString strDatabase, CString strSqlDisk)
{

OpenFile(strSqlDisk); //打开脚本文件

strSqlScript=strSql;


CoInitialize(NULL);

_ConnectionPtr pConn("ADODB.Connection");
_RecordsetPtr pRst("ADODB.Recordset");
_bstr_t strCnn("Provider=sqloledb;Data Source=Myserver;Initial Catalog=strDatabase;User Id=sa;Password=;");


try
{
pConn->Open(strCnn,"","",adConnectUnspecified); //返回单独的每句话。
}
catch (_com_error &e)
{
CString strError;

strError.Format("Run-time error'%d(%x)'",e.Error(),e.Error());
strError+="\n\n";
strError+=e.Description();
AfxMessageBox(strError);
return -1;
}

LPSTR strSingle;
int i=0;
while(*strSqlScript!=NULL)
{

strSingle=GetSingleScript();

if(strSingle==NULL) continue;
try
{
pConn->Execute(_bstr_t(strSingle),NULL,adCmdText);
}
catch (_com_error &e)
{
CString strError;

strError.Format("Run-time error'%d(%x)'",e.Error(),e.Error());
strError+="\n\n";
strError+=e.Description();
AfxMessageBox(strError);

}

}

pConn->Close();
::CoUninitialize();
return 0;
}

BOOL CDatabaseCrApp::OpenFile(CString strSqlDisk)
{
CFile file;
if(file.Open(strSqlDisk,CFile::modeRead)==FALSE)
{
AfxMessageBox("打開sql腳本失敗!");
return FALSE;
}

DWORD filelength=file.GetLength();
strSql= new char[filelength];
file.ReadHuge(strSql,filelength);
file.Close();
return TRUE;

}

char* CDatabaseCrApp::GetSingleScript()
{
char *strSingle=new char[1024*64];
int i=0;

while(*strSqlScript!=NULL)
{
if(*strSqlScript<=' ' || *strSqlScript>'~' )
strSqlScript++;
else
break;
}

while (*strSqlScript!= NULL)

{
if(*strSqlScript>=' ' && *strSqlScript<='~')
{
if(*strSqlScript == 'G')
{
if(*(++strSqlScript)=='O')
{
strSqlScript++;
if(*(strSqlScript)<' ' || *(strSqlScript)>'~')
{
return strSingle;
}
else
{
strSingle[i++]='O';
strSingle[i++]=*strSqlScript;
}
}
else
{
strSingle[i++]='G';
strSingle[i++]=*(strSqlScript++);
}
}
strSingle[i++]=(*strSqlScript++);
}
else
{
strSingle[i++]=' ';
strSqlScript++;
}
}
return NULL;
}
  • 打赏
  • 举报
回复
wuchunzhong 2002-05-21
sql server的就不太清楚了。
  • 打赏
  • 举报
回复
small_wei 2002-05-21
在程序中直接运行isql命令
isql 实用工具
isql 实用工具使您得以输入 Transact-SQL 语句、系统过程和脚本文件;并且使用 DB-Library 与 Microsoft® SQL Server™ 2000 进行通讯。

语法
isql
[-?] |
[-L] |
[
{
{-U login_id [-P password]}
| -E
}
[-S server_name] [-H wksta_name] [-d db_name]
[-l time_out] [-t time_out] [-h headers]
[-s col_separator] [-w column_width] [-a packet_size]
[-e] [-x max_text_size]
[-c cmd_end] [-q "query"] [-Q "query"]
[-n] [-m error_level] [-r {0 | 1}]
[-i input_file] [-o output_file] [-p]
[-b] [-O]
]

参数-?

显示 isql 开关的语法摘要。

-L

列出在本地配置的服务器和在网络上广播的服务器的名称。

-U login_id

用户登录 ID。登录 ID 区分大小写。

-P password

是用户指定的密码。如果未使用 -P 选项,isql 将提示输入密码。如果在命令提示的末尾使用 -P 选项而不带密码,isql 使用默认密码 (NULL)。密码区分大小写。

ISQLPASSWORD 环境变量使您得以为当前会话设置默认密码。因此,不需要通过硬编码来在批处理文件中设置密码。

如果没有为 -P 选项指定密码,isql 首先检查 ISQLPASSWORD 变量。如果未设置值,isql 使用默认密码 (NULL)。以下示例在命令提示处设置 ISQLPASSWORD 变量,然后访问 isql 实用工具:

C:\>SET ISQLPASSWORD=abracadabra
C:\>isql

-E

使用信任连接而不请求密码。

-S server_name

指定要连接到的 SQL Server 默认实例。isql 不支持连接到 SQL Server 2000 命名实例。如果未指定服务器,isql 将连接到本地计算机上的 SQL Server 默认实例。如果要在网络上从远程计算机执行 isql,则需要此选项。

-H wksta_name

是工作站名称。工作站名称存储在 sysprocesses.hostname 中并由 sp_who 显示。如果未指定,则采用当前计算机名称。

-d db_name

启动 isql 时发出一个 USE db_name 语句。

-l time_out

指定 isql 登录超时之前的秒数。如果未指定 time_out 值,则命令无限期地运行。登录到 isql 的默认超时为 8 秒。

-t time_out

指定命令超时之前的秒数。如果未指定 time_out 值,则命令会无限期地运行;登录到 isql 的默认超时为 8 秒。

-h headers

指定要在列标题之间打印的行数。默认为每一查询结果集打印一次标题。使用 –1 指定不打印标题。如果使用 –1,则在参数和设置之间不能有空格(可以是 -h-1,不能是 -h –1)。

-s col_separator

指定列分隔符字符,其默认为空格。若要使用对操作系统有特殊含义的字符(例如 | ; & < >),请将该字符用双引号 (") 引起来。

-w column_width

允许用户设置屏幕输出的宽度。默认为 80 个字符。当输出行达到其最大屏幕宽度时,会拆分为多个行。

-a packet_size

使您得以请求不同大小的数据包。packet_size 的有效值介于 512 和 65535 之间。Microsoft Windows NT® 版中的 isql 默认值为 8192;另外,Microsoft MS-DOS® 版中的 isql 默认值为 512,但在该版本中也可以请求更大的数据包。数据包大小的增加可以提高较大脚本执行的性能,在这种执行中 GO 命令之间 SQL 语句的数量很重要。Microsoft 的测试表明 8192 是大容量复制操作典型的最快设置。可以请求更大的数据包大小,但是如果请求不能得到批准,则 isql 默认为 512。

-e

回显输入。

-x max_text_size

指定返回文本数据的最大长度,以字节为单位。长于 max_text_size 的文本值将被截断。如果未指定 max_text_size,则文本数据在 4096 字节处截断。

-c cmd_end

指定命令终止符。默认情况下,通过单独在一行中输入 GO 来终止命令并将其发送到 SQL Server 2000。在重置命令终止符时,不要使用对操作系统有特殊含义的 Transact-SQL 保留字或字符,无论其前面是否有反斜杠。

-q "query"

启动 isql 时执行查询,但是在查询完成时不退出 isql。(注意查询语句不应包含 GO)。如果从批处理文件中发出查询,可使用 %variables。环境 %variables% 也可用。例如:

SET table = sysobjects
isql /q "Select * from %table%"

将查询用双引号引起来,将查询中嵌入的任何内容用单引号引起来。

-Q "query"

执行查询,在查询完成时立即退出 isql。将查询用双引号引起来,将查询中嵌入的任何内容用单引号引起来。

-n

从输入行中删除编号和提示符号 (>)。

-m error_level

自定义错误信息的显示。显示指定的或更高严重级别错误的消息数、状态和错误级别。不显示严重级别低于指定级别的错误的任何信息。用 -1 指定与消息一起返回所有标题,即使是信息类的消息。如果使用 –1,则在参数和设置之间不能有空格(可以是 -m-1,不能是 -m -1)。

-r {0 | 1}

将消息输出重定向到屏幕 (stderr)。如果未指定参数,或指定参数为 0,那么仅重定向严重级别为 17 或更高的错误信息。如果指定参数为 1,则将重定向所有消息输出(包括 "print")。

-i input_file

标识包含一批 SQL 语句或存储过程的文件。小于 (<) 比较运算符可以用来代替 –i。

-o output_file

标识从 isql 接收输出的文件。大于 (>) 比较运算符可以用来代替 –o。

-p

打印性能统计。

-b

指定错误发生时 isql 退出并返回一个 DOS ERRORLEVEL 值。当 SQL Server 错误信息的严重级别为 10 或更高时,返回给 DOS ERRORLEVEL 变量的值为 1;否则,返回值为 0。MS-DOS 批处理文件可以测试 DOS ERRORLEVEL 的值并适当处理错误。

-O

指定 isql 还原为早期版本的行为。下列功能停用:

EOF 批处理


控制台宽度自动调整


宽信息
该选项还将 DOS ERRORLEVEL 的默认值设置为 –1。

注释
所有 DB-Library 应用程序(如 isql)连接到 SQL Server 2000 后,作为 SQL Server 6.5 级客户端工作。它们不支持 SQL Server 2000 的某些功能。而 osql 实用工具是基于 ODBC 并支持 SQL Server 2000 的全部功能。使用 osql 运行 isql 无法运行的脚本。有关 SQL Server 6.5 级客户端限制的更多信息,请参见 SQL Server 联机丛书中的将早期版本客户端连接到 SQL Server 2000。

默认情况下,SQL 查询分析器将 SQL 脚本保存为 Unicode 文件。isql 实用工具不支持 Unicode 输入文件。尝试在 -i 开关中指定这些文件中的某一个时会导致错误 170:

Incorrect syntax near ' '.

使用 osql 实用工具运行这些 Unicode 文件。另一种方法是在 SQL 查询分析器的"文件/另存为"对话框的"文件格式"列表中指定 ANSI 而非 Unicode。

与大多数 DB-Library 应用程序类似,isql 实用工具在默认情况下不设置任何连接选项。用户如果希望使用特定连接选项设置,必须交互地或在脚本中发出 SET 语句。

isql 实用工具从操作系统直接启动,并且使用本文中列出的区分大小写的选项。启动后,isql 接受 Transact-SQL 语句并将它们交互地发送到 SQL Server 2000。结果将格式化并打印到标准输出设备(屏幕)。可使用 QUIT 或 EXIT 退出 isql。

如果启动 isql 时未指定用户名,则 SQL Server 2000 将检查环境变量并使用它们,如 isqluser=(user) 或 isqlserver=(server)。如果未设置环境变量,则使用工作站用户名。如果未指定服务器,则使用工作站名称。

如果 -U 或 -P 选项都没有使用,则 SQL Server 2000 将尝试使用 Windows 身份验证模式进行连接。身份验证基于运行 isql 的用户的 Windows NT 帐户。

除了 isql 中使用的 Transact-SQL 语句外,下表中的命令也可用。

命令 描述
GO 执行最后一个 GO 命令之后输入的所有语句。
RESET 清除已输入的所有语句。
ED 调用编辑器。
!! command 执行操作系统命令。
QUIT 或 EXIT( ) 退出 isql。
CTRL+C 不退出 isql 而结束查询。


仅当命令终止符 GO(默认)、RESET、ED、!!、EXIT、QUIT 和 CTRL+C 出现在一行的开始(紧跟 isql 提示符)时才可以被识别。isql 忽视同一行中这些关键字后输入的任何内容。

GO 表明一批的结束和任何已被高速缓存的 Transact-SQL 语句的执行。在每个输入行的结尾按 ENTER 键,isql 将缓存此行的语句。键入 GO 后按 ENTER 键时,所有当前已被高速缓存的语句将作为一批发送到 SQL Server 2000。

当前的 isql 实用工具工作起来就好像在任何被执行的脚本结尾处都带有隐含的 GO,因而脚本中的所有语句都将执行。除非输出脚本中至少有一个 GO,否则一些早期版本的 isql 将不发送任何语句到服务器。最后一个 GO 后的任何语句都不执行。

通过键入以命令终止符作为开始的行来结束命令。可以在命令终止符后输入一个整数来指定命令运行的次数。例如,若要执行此命令 100 次,请键入:

SELECT x = 1
GO 100

结果在执行结束时打印一次。使用 isql 时,每行字符数目限制为 1000 个。长语句应当跨多个行书写。

通过在行首键入 ED,用户可以在当前查询缓冲区上调用编辑器。编辑器在 EDITOR 环境变量中定义。默认编辑器是 MS-DOS 和 Windows NT 的"edit"。可以通过设置 EDITOR 环境变量来指定其它编辑器。例如,若要将默认编辑器指定为 Notepad,请在操作系统提示符处输入:

SET EDITOR=notepad

有关在何处可以找到或运行该实用工具的更多信息,请参见命令提示实用工具入门。

操作系统命令
通过用两个惊叹号 (!!) 开始一行,然后输入命令的方式,也可以执行操作系统命令。DOSKEY 命令撤回工具可以用来撤回和修改以前在运行 Windows NT 的计算机上输入的 isql 语句。键入 RESET 可以清除现有的查询缓冲区。

在运行存储过程时,isql 在批处理中的每个结果集之间打印一个空行。此外,如果没有应用于已执行的语句,则"0 行受到影响"消息不会出现。
  • 打赏
  • 举报
回复
countrynew 2002-05-21
g-z
  • 打赏
  • 举报
回复
junguo 2002-05-21
我就写sql server的
  • 打赏
  • 举报
回复
wuchunzhong 2002-05-21
应该是可以的,不过SQL的写法应该是根据具体连接的数据库类型有关!
  • 打赏
  • 举报
回复
发帖
VC/MFC

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2002-05-21 07:10
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……