Как заставить сборку завершиться с ошибкой при запуске bcp из сценария msbuild? - PullRequest
1 голос
/ 19 мая 2011

В составе sql server 2005 есть команда массового копирования "bcp.exe" (http://msdn.microsoft.com/en-us/library/ms162802%28SQL.90%29.aspx)

Мы запускаем команду bcp из нашего скрипта msbuild, используя задачу exec. К сожалению, когда bcp не удается загрузить строку данных, сборка все равно завершается успешно.

Я попытался (согласно приведенному ниже фрагменту сценария сборки) указать файл ошибок и проверить его существование, к сожалению, это означает, что сборка всегда завершается неудачей, даже если bcp полностью завершается успешно, поскольку кажется, что bcp всегда будет создавать файл ошибок, даже если ошибок нет.

<ItemGroup>
  <bcpFiles Include="$(DataPath)\*.txt" />
</ItemGroup>
<Delete Files="BcpErrors.txt" />
<Message Text="bcp $(DatabaseName).dbo.%(bcpFiles.FileName) in %(bcpFiles.FullPath) -eBcpErrors.txt -c -E -q -t&quot;`&quot; -r&quot;`\n&quot; $(bcpConnectionString)" />
<Exec Command="bcp $(DatabaseName).dbo.%(bcpFiles.FileName) in %(bcpFiles.FullPath) -eBcpErrors.txt -c -E -q -t&quot;`&quot; -r&quot;`\n&quot; $(bcpConnectionString)" />
<Error Condition="Exists('BcpErrors.txt')" Text="One or more bcp commands contained errors." />

Есть ли способ заставить msbuild завершить сборку, если bcp не может загрузить какие-либо данные?

Ответы [ 3 ]

0 голосов
/ 19 мая 2011

Вы можете использовать задачу MSBuild ExtensionPack"Файл", чтобы найти текст ошибки в выходном файле:

    <MSBuild.ExtensionPack.FileSystem.File TaskAction="FilterByContent" RegexPattern="Error = " Files="BcpErrors.txt">
        <Output TaskParameter="IncludedFileCount" PropertyName="ErrorFileCount"/>
    </MSBuild.ExtensionPack.FileSystem.File>        
    <Error Condition="$(ErrorFileCount) != 0" Text="One or more bcp commands contained errors." />
0 голосов
/ 20 мая 2011

Хорошо, поэтому он не совсем использует bcp.exe, но BULK INSERT очень похож на bcp.exe, может принимать тот же формат файлов и имеет большинство из тех же параметров. Задача Sql.Execute также не будет выполнена, если запрос BulkInsert завершится неудачно. Итак, я закончил с

<ItemGroup>
  <bcpFiles Include="$(DataPath)\*.txt" />
</ItemGroup>
<Sql.Execute ConnectionString="$(ConnectionString)" Sql="BULK INSERT [$(DatabaseName)].dbo.[%(bcpFiles.FileName)] FROM '%(bcpFiles.FullPath)' WITH (DATAFILETYPE='char', KEEPIDENTITY, FIELDTERMINATOR='`', ROWTERMINATOR='`\n', MAXERRORS=1)" />

(Задача Sql.Execute определена в Microsoft.Sdc.Common.tasks)

0 голосов
/ 19 мая 2011

Если BCP возвращает ненулевой код ошибки для сбоя, то задача MSBuild Exec должна обнаружить это и пометить задачу как сбойную.

...