【发布时间】:2012-08-19 16:33:22
【问题描述】:
我有一个批处理文件,其内容如下:
@Echo Off
goto skipcomments
rem
:skipcomments
call setup-CIpatch-db.bat
if not "%UserName%"=="" goto ok
echo You must edit setup-CIpatch-db.bat to set variables.
echo This script no longer takes command line arguments.
goto end
:ok
if exist *.out del *.out
echo CoreIssue FleetOne Maintenance Release
echo working... DO NOT CLOSE
REM ************************************************
REM Script in which Print Statement has been removed
REM ************************************************
REM ************************************************
REM Create Scripts for Tables
REM ************************************************
REM ************************************************
REM Alter Scripts for Tables
REM ************************************************
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i AlterTablecardBacktable07312012.sql -o AlterTablecardBacktable07312012.out
REM ************************************************
REM Data Updates
REM ************************************************
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i AlterDrpandCrePrimKeyCardback.sql -o AlterDrpandCrePrimKeyCardback.out
REM ************************************************
REM Performance Updates
REM ************************************************
REM ************************************************
REM Security Update Scripts
REM ************************************************
REM ************************************************
REM Reports scripts
REM ************************************************
REM ************************************************
REM New or Altered Stored Procedures
REM ************************************************
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i sp_RejectAccounts_qsel.sql -o sp_RejectAccounts_qsel.out
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i sp_RejectAccounts_sel.sql -o sp_RejectAccounts_sel.out
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i sp_GetCompanyRecordCardRequest_01Aug2012.sql -o sp_GetCompanyRecordCardRequest_01Aug2012.out
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i SPGetCreditTransactions.sql -o SPGetCreditTransactions.out
REM ************************************************
REM Grant.sql for new or altered SP
REM ************************************************
REM ************************************************
REM Platform TranID Change Scripts
REM ************************************************
REM ************************************************
REM Version number update
REM ************************************************
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i version.sql -o version.out
echo All Scripts have been started
:end
pause
脚本执行同一文件夹中的 SQL 文件,并生成扩展名为“.out”的文件。这些只包含结果;与我们在 SSMS 消息窗口中执行任何查询时相同,例如受影响的 1 行等。在批处理文件执行完所有脚本后(通过 ADO.net/C#),我们必须检查输出文件中的关键字,例如“错误”等等。
现在我被赋予了自动化的任务,这就是我正在做的事情:
获取批处理文件中的 .SQL 文件名并使用 SqlConnection、SqlCommand 等执行它们。问题是,当查询中有任何错误时,会引发异常。我需要的是查询应该执行,我应该能够得到结果。 (如受影响的 1 行等)。就像在 SSMS 中一样,当我们执行任何错误查询时,它会执行并在消息窗格中显示错误。
谁能指导我?
【问题讨论】:
-
这与 C# 和 ADO.Net 有什么关系?
-
如果脚本出错,你怎么能期望它完成?你是说如果对
osql的第一次调用是错误的,你希望前面的脚本仍然执行第二次、第三次、第n 次调用osql?或者您是说如果 script1.sql 的一部分失败,该脚本的其余部分必须继续执行? -
仍然有点困惑 - 所以最初批处理文件是使用 C# 执行的(仍然不明白这里的 ADO.Net 链接),现在你将错误部分自动化,所以你不再执行批处理文件但剥离 sql 脚本并在您的 c# 应用程序中一一执行?
-
当您执行命令即
SqlCommand.ExecuteNonQuery这将返回影响的行数。 - 如果有错误你会得到一个 SqlException 并且你应该回滚那里的事务 0 行影响... -
@ChrisMoutray 你能给我像 SSMS 一样执行它的过程吗?
标签: c# sql-server tsql ado.net ssms