Код C# или BIML для вставки записей в БД

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

У меня есть таблица с именем BIML extension, созданная в моей БД, и у меня есть 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. Можете ли вы сообщить мне о проблеме, стоящей за ней?


person Sqldev_91    schedule 19.06.2019    source источник


Ответы (1)


В простейшей форме у вас будет такой контент в вашем скрипте 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 или 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 в качестве примера. Если бы я создавал пакеты, у меня, вероятно, была бы переменная для имени моего пакета, поэтому я бы также ссылался на нее в своем заявлении.

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

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

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

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

person billinkc    schedule 19.06.2019
comment
Я попробовал вашу строку кода 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) ЗНАЧЕНИЯ (@audit_id, @Package,@audit_Logtime); DataTable dt = ExternalDataAccess.GetDataTable(connectionString,SrcTablequery); Ниже приведена ошибка, в которой необходимо объявить скалярную переменную audit_id. Можете ли вы сообщить мне о проблеме, стоящей за ней. - person Sqldev_91; 20.06.2019
comment
Спасибо за вашу помощь, и у меня есть код выше, но у него есть некоторые проблемы, которые необходимо объявить (@audit_id). Можете ли вы сообщить мне, как это исправить. - person Sqldev_91; 20.06.2019
comment
Я попробовал другую строку метода connectionString = Data Source = HQ-DEV-SQLDW01; Initial Catalog = IM_STAGE; Integrated Security = SSPI; Auto Translate = False; Provider = System.Data.SqlClient.SqlConnection, System.Data, Version = 2.0. .0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089;; SqlConnection con = новое SqlConnection(connectionString); кон.открыть(); SqlCommand cmd = new SqlCommand (ВСТАВИТЬ В Audit.BIML_audit (Package, audit_Logtime) VALUES ('xyz', GETDATE()), con); cmd.ExecuteNonQuery(); - person Sqldev_91; 21.06.2019
comment
Приведенный выше код выдает следующую ошибку: «SqlConnection» не содержит определения для «open», и не может быть найден метод расширения «open», принимающий первый аргумент типа «SqlConnection» (вам не хватает директивы using или ссылки на сборку? - person Sqldev_91; 21.06.2019
comment
Методы в C# чувствительны к регистру, поэтому con.Open - person billinkc; 21.06.2019
comment
Спасибо за все ваши рекомендации, теперь все работает нормально. Также вы предлагаете какую-либо книгу, чтобы начать писать BIML и получить ее. - person Sqldev_91; 24.06.2019
comment
Книга Biml – единственная книга на рынке, в которой описывается все, что было доступно на конец 2017 года - person billinkc; 25.06.2019