我想在运行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,您可以让我知道其背后的问题吗?
答案 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,因此出错。这很有意义-此查询指定它将提供三个变量,但不提供任何变量。
最快的解决方法是以这种方式重新定义您的查询
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可能会有一个变量,因此我也会在声明中引用它。
将第三行替换为.NET库用法,就像您在using parameters inserting data into access database上的heikofritz中看到的那样。
1)创建数据库连接
2)打开连接
3)创建命令对象并与连接关联
4)指定语句(使用?
作为序号而不是命名参数,因为它是oledb)
5)创建一个参数列表并与值关联
很多例子都超出了参考文献,但这是第一击。只需忽略Access连接字符串并使用您的原始值即可。