C # или BIML-код для вставки записей в БД - PullRequest
2 голосов
/ 19 июня 2019

Я хочу вставить значения в базу данных, когда biml-код запущен и пакет завершил расширение, возможно ли это с помощью BIML или c #?

У меня есть таблица с именем BIML-расширения, созданная в моей БД, и у меня есть test.biml, который загружает пакет test.dtsx всякий раз, когда расширение BIML завершается, в мою таблицу должна быть вставлена ​​запись о том, что расширение завершено.

Дайте мне знать, если у вас есть какие-либо вопросы или вам нужна дополнительная информация.

Из комментариев

Я попробовал твой код

string connectionString = "Data Source=hq-dev-sqldw01;Initial Catalog=IM_Stage;Integrated Security=SSPI;Provider=SQLNCLI11.1"; 
string SrcTablequery=@"INSERT INTO BIML_audit (audit_id,Package,audit_Logtime) VALUES (@audit_id, @Package,@audit_Logtime)"; 
DataTable dt = ExternalDataAccess.GetDataTable(connectionString,SrcTablequery);

В нем есть ошибка, приведенная ниже. Должна быть объявлена ​​скалярная переменная audit_id. Можете ли вы сообщить мне причину проблемы?

1 Ответ

2 голосов
/ 19 июня 2019

В простейшей форме у вас будет такой контент в вашем Biml-скрипте

// Define the connection string to our database 
string connectionStringSource = @"Server=localhost\dev2012;Initial Catalog=AdventureWorksDW2012;Integrated Security=SSPI;Provider=SQLNCLI11.1";

// Define the query to be run after *ish* expansion
string SrcTableQuery = @"INSERT INTO dbo.MyTable (BuildDate) SELECT GETDATE()";

// Run our query, nothing populates the data table
DataTable dt = ExternalDataAccess.GetDataTable(connectionStringSource, SrcTableQuery);

Множество разных способов сделать это - вы могли бы запустить свой собственный менеджер соединений OLE / ADO и использоватьметоды класса.Вы могли извлечь строку подключения из коллекции Biml Connections (в зависимости от уровня, в котором она выполняется) и т. Д.

Предостережения

В зависимости от продукта (BimlStudio vs BimlExpress) можетбыть фоновым процессом, компилирующим ваш BimlScript, чтобы гарантировать, что все метаданные готовы для intellisense, чтобы забрать его.Возможно, вам потребуется встроить эту логику в очень многоуровневый Biml-файл, чтобы убедиться, что он вызывается только тогда, когда вы к нему готовы.например,

<#@ template tier="999" #>
<#
// Define the connection string to our database 
string connectionStringSource = @"Server=localhost\dev2012;Initial Catalog=AdventureWorksDW2012;Integrated Security=SSPI;Provider=SQLNCLI11.1";

// Define the query to be run after *ish* expansion
string SrcTableQuery = @"INSERT INTO dbo.MyTable (BuildDate) SELECT GETDATE()";
// Run our query, nothing populates the data table
DataTable dt = ExternalDataAccess.GetDataTable(connectionStringSource, SrcTableQuery);
#>

Это проблема, которую вы пытаетесь решить?

Обращение к комментарию / вопросам

Учитывая запрос

string SrcTablequery=@"INSERT INTO BIML_audit (audit_id,Package,audit_Logtime) VALUES (@audit_id, @Package,@audit_Logtime)"; 

ошибки из-за того, что @audit_id не указан.Что имеет смысл - этот запрос указывает, что он предоставит три переменные, и ни одна из них не предоставлена.

Вариант 1 - ленивый способ

Самым быстрым решением было бы переопределить ваш запрос таким образом

string SrcTablequery=string.Format(@"INSERT INTO BIML_audit (audit_id,Package,audit_Logtime) VALUES ({0}, '{1}', '{2})'", 123, "MyPackageName", DateTime.Now); 

Я использую метод Format библиотеки строк, чтобы вставить фактические значения в заполнители.Я предполагаю, что audit_id - это число, а два других - это строки, поэтому отметки вокруг них 1 и 2.Вам нужно будет определить значение для вашего идентификатора аудита, но в качестве примера я поставил 123.Если бы я генерировал пакеты, у меня, скорее всего, была бы переменная для моего packageName, поэтому я бы сослался на это и в своем утверждении.

Вариант 2 - лучший способ

Заменить третью строкус использованием библиотеки .NET, как вы видите в heikofritz на с использованием параметров, вставляющих данные в базу данных доступа .

1) Создайте базу данных Соединение 2) Откройте соединение 3) Создайте объект команды и свяжитес соединением 4) Укажите свое утверждение (используйте ? в качестве порядкового маркера вместо именованных параметров, поскольку это oledb) 5) Создайте список параметров и свяжите его со значениями

Много, много примеров за пределамиссылались, но это был первый удар.Просто игнорируйте строку подключения Access и используйте исходное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...