【问题标题】:Executing SQL scripts via Ado.NET with the results like in SSMS通过 Ado.NET 执行 SQL 脚本,结果类似于 SSMS
【发布时间】: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


【解决方案1】:

查看docs on MSDNoSql 支持-m-r 2 个参数,这应该可以让您更好地处理错误输出。

作为批处理脚本的一部分,您还可以检查错误级别,如下所示

注意:我使用标签创建了一个函数来执行我的脚本,而不会重复所有错误代码

REM run list of scripts
call :UpgradeDatabase AlterTablecardBacktable07312012.sql
call :UpgradeDatabase version.sql

goto :eof

:UpgradeDatabase

set upgradeScript=%~1

echo Running script %upgradeScript% on database %databaseName%...
sqlcmd -S %serverName% -d %databaseName% -U %userName% -P %password% -i %upgradeScript% -o %logPath%\%upgradeScript%.log
if %errorlevel% == 0 (
    echo Script %upgradeScript% on database %databaseName% successful
) ELSE (
    echo Script %upgradeScript% on database %databaseName% FAILED
    echo. > %logPath%\ERROR_%upgradeScript%.log
)
echo.
echo.

goto :eof

【讨论】:

  • 我已经把我的问题写得更详细了,请检查。
猜你喜欢
  • 1970-01-01
  • 2019-06-18
  • 2018-08-05
  • 2010-11-14
  • 1970-01-01
  • 2022-01-13
  • 2010-12-14
  • 1970-01-01
  • 2014-02-14
相关资源
最近更新 更多