用于将记录插入数据库的C#或BIML代码

时间:2019-06-19 16:02:52

标签: ssis biml

我想在运行biml代码并且程序包已完成扩展时将值插入数据库中,是否可以使用BIML或c#?

我在数据库中创建了一个名为BIML扩展的表,并且我有test.biml,每当BIML扩展完成时,它都会加载程序包test.dtsx,应该将一条记录插入到我的表中,表示扩展已完成。

如果您有任何疑问或需要任何其他信息,请告诉我。

来自评论

我尝试了您的代码

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 个答案:

答案 0 :(得分:2)

以最简单的形式,您将在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,以确保所有元数据都已准备就绪,可用于智能感知。您可能需要将该逻辑存储到一个非常high tiered的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周围的刻度线。您需要为审核ID定义一个值,但我以123为例。如果我正在生成软件包,那么我的packageName可能会有一个变量,因此我也会在声明中引用它。

选项2-更好的方法

将第三行替换为.NET库用法,就像您在using parameters inserting data into access database上的heikofritz中看到的那样。

1)创建数据库连接 2)打开连接 3)创建命令对象并与连接关联 4)指定语句(使用?作为序号而不是命名参数,因为它是oledb) 5)创建一个参数列表并与值关联

很多例子都超出了参考文献,但这是第一击。只需忽略Access连接字符串并使用您的原始值即可。