Sql 我们可以在企业库中传递一个表作为参数吗?
我正在使用企业库进行一个sql项目Sql 我们可以在企业库中传递一个表作为参数吗?,sql,sql-server,ado,Sql,Sql Server,Ado,我正在使用企业库进行一个sql项目 public void InsertTotalOrdersIntoYearlyTable(int val, double emSal) { DbCommand cmd = db.GetSqlStringCommand("INSERT INTO Table1 (TotalValue,TotalSalary) VALUES (@val, @emSal)"); db.AddInParamet
public void InsertTotalOrdersIntoYearlyTable(int val, double emSal)
{
DbCommand cmd = db.GetSqlStringCommand("INSERT INTO Table1 (TotalValue,TotalSalary) VALUES (@val, @emSal)");
db.AddInParameter(cmd, "val", DbType.Int32, val);
db.AddInParameter(cmd, "emSal", DbType.Double, emSal);
}
现在我必须通过一些操作插入到另一个表中,并且我正在创建另一个方法,因此我想将该表作为参数发送给一个方法,这样我就不会重复该方法。可以这样做吗?听起来像是在尝试执行一个方法调用,以将数据从c#插入SQL。您可以在SQL中使用用户定义的表类型来实现这一点 下面是SQL用户定义表
CREATE TYPE [dbo].[udt_Table] AS TABLE(
[TotalValue] [int] NOT NULL,
[TotalSalary] [Double] NOT NULL
PRIMARY KEY CLUSTERED
(
[TotalValue] ASC,
[TotalSalary] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
现在是一个使用用户定义的表类型的存储过程
CREATE PROCEDURE [dbo].[usp_table_insert]
@UdtTableIn dbo.udt_Table ReadOnly
AS
BEGIN
SET NOCOUNT ON;
insert into table Table1 ( TotalValue, TotalSalary)
values ( source.TotalValue, source.TotalSalary);
END
现在使用C#(ado)代码进行单个调用
/// <summary>
/// Processes the counts from the float file, and adds the values to the database.
/// </summary>
/// <param name="valuesToBeInserted">
/// The count of the accounts in the Float file that was parsed.
/// </param>
public void ProcessCountResults(Dictionary<long, int> valuesToBeInserted)
{
// Creating a data table and adding the columns with their names and types.
var resultsDataTable = new DataTable();
resultsDataTable.Columns.Add("TotalValue", typeof(int));
resultsDataTable.Columns.Add("TotalSalary", typeof(long));
foreach (var values in valuesToBeInserted)
{
// Creating and then adding data to the data row.
var dataRow = resultsDataTable.NewRow();
// Adding the primary key values first.
dataRow["TotalValue"] = values.Key;
dataRow["TotalSalary"] = values.Value;
// Adding the row to the data table.
resultsDataTable.Rows.Add(dataRow);
}
// Calling the method to insert the data table into the SQL database.
this.InsertDataTableIntoSqlDatabase(resultsDataTable, "dbo.usp_table_insert", "@CorpUpld_UDT");
}
/// <summary>
/// Inserts a data table into a SQL database.
/// </summary>
/// <param name="dataTable">
/// The data table to be inserted
/// </param>
/// <param name="spCommand">
/// The string name of the stored procedure command to be executed.
/// </param>
/// <param name="parameterName">
/// The name of the parameter to be used.
/// </param>
private void InsertDataTableIntoSqlDatabase(DataTable dataTable, string spCommand, string parameterName)
{
using (var connection = (SqlConnection)this.connectionManager.AcquireConnection(this.scriptObjectModelTransaction))
{
using (var command = new SqlCommand(spCommand, connection))
{
// Specify the command as a stored procedure.
command.CommandType = CommandType.StoredProcedure;
// Adding the parameter with values to the stored procedure call.
command.Parameters.AddWithValue(parameterName, dataTable);
// Executing the stored procedure.
command.ExecuteNonQuery();
}
}
}
}
//
///处理浮点文件中的计数,并将值添加到数据库中。
///
///
///已分析的浮点文件中的帐户计数。
///
public void ProcessCountResults(字典值待插入)
{
//创建数据表并添加列及其名称和类型。
var resultsDataTable=新数据表();
resultsDataTable.Columns.Add(“TotalValue”,typeof(int));
resultsDataTable.Columns.Add(“TotalSalary”,typeof(long));
foreach(var值在valuesToBeInserted中)
{
//创建数据,然后将数据添加到数据行。
var dataRow=resultsDataTable.NewRow();
//首先添加主键值。
dataRow[“TotalValue”]=values.Key;
dataRow[“TotalSalary”]=values.Value;
//将行添加到数据表中。
resultsDataTable.Rows.Add(dataRow);
}
//调用方法将数据表插入SQL数据库。
这个.InsertDataTableIntoSqlDatabase(resultsDataTable,“dbo.usp_table_insert”,“@CorpUpld_UDT”);
}
///
///将数据表插入SQL数据库。
///
///
///要插入的数据表
///
///
///要执行的存储过程命令的字符串名称。
///
///
///要使用的参数的名称。
///
私有void insertdatatabletosqldatabase(DataTable DataTable,string spCommand,string parameterName)
{
使用(var connection=(SqlConnection)this.connectionManager.AcquireConnection(this.scriptObjectModelTransaction))
{
使用(var命令=新的SqlCommand(spCommand,connection))
{
//将命令指定为存储过程。
command.CommandType=CommandType.storedProcess;
//将带有值的参数添加到存储过程调用中。
command.Parameters.AddWithValue(parameterName,dataTable);
//执行存储过程。
command.ExecuteNonQuery();
}
}
}
}
请记住,这里我使用的是ProcessCountResults方法的字典。你可以把它改成你想要的任何东西。关键是需要填充一个c#数据表,该表将作为存储过程参数传递。只需确保c#dataTable与用户定义的表类型匹配即可 是否要将表名作为参数传递到
GetSqlStringCommand()
中?可以在代码中参数化表名。类似于“INSERT-INTO”+TableName+”(TotalVa…应该可以完成这项工作。但是,与往常一样,对于动态创建的SQL语句,您必须注意可能的注入攻击()您正在插入SQL表,我的问题是插入的表来自SQL或ado(看起来像c#,像c#datatable数据类型)