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

我正在使用企业库进行一个sql项目

        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数据类型)