C# 使用DbCommand的数组绑定参数

C# 使用DbCommand的数组绑定参数,c#,sql,database,oracle,dbconnection,C#,Sql,Database,Oracle,Dbconnection,我正在尝试使用DbCommand绑定一个数组,以便在批量操作中将数据插入到表中 我可以使用OracleCommand(因此也可以使用OracleConnection)执行此操作,方法是: var referenceValues=validRecords.Select(x=>x.Reference.ToArray(); var fundDescriptionValues=validRecords.Select(x=>x.FundDescription.ToArray(); var fundCode

我正在尝试使用DbCommand绑定一个数组,以便在批量操作中将数据插入到表中

我可以使用
OracleCommand
(因此也可以使用
OracleConnection
)执行此操作,方法是:

var referenceValues=validRecords.Select(x=>x.Reference.ToArray();
var fundDescriptionValues=validRecords.Select(x=>x.FundDescription.ToArray();
var fundCodeValues=validRecords.Select(x=>x.FundCode.ToArray();
OracleConnection con=新的OracleConnection(oracleConnectionString);
con.Open();
OracleParameter referenceParam=新的OracleParameter
{
OracleDbType=OracleDbType.Varchar2,
值=参考值
};
OracleParameter fundDescriptionParam=新的OracleParameter
{
OracleDbType=OracleDbType.Varchar2,
值=fundDescriptionValues
};
OracleParameter fundCodeParam=新的OracleParameter
{
OracleDbType=OracleDbType.Varchar2,
值=FundCodeValue
};
OracleCommand cmd=con.CreateCommand();
cmd.CommandText=@”
在基金中插入
(
参考,
基金名称:,
基金代码
)
价值观
(
:1,
:2,
:3
)";
cmd.ArrayBindCount=referenceValues.Length;
cmd.Parameters.Add(referenceParam);
cmd.Parameters.Add(fundDescriptionParam);
cmd.Parameters.Add(fundCodeParam);
cmd.ExecuteNonQuery();
con.Close();
有没有一种方法可以使用
DbCommand
(因此也可以使用
DbConnection
)执行这种类型的操作


我们正在迁移到SQL Server而不是Oracle,但我仍然希望使用通用库,而不是
SQLCommand

不,SQL中没有任何操作可以将其插入到一个命令中。您必须迭代数组并逐个插入。参数化命令是一种很好的方法。@Holger那么这个功能是OracleCommand库独有的吗?SQLCommand库中是否有一个等价的工具?越通用,命令的公共子集就越小。这个最小的子集是ANSI-SQL。没有批量插入或更新的。因此,只要向服务器发送文本命令,就没有特定于某个SQL server的内容。除文本以外的任何其他通信都必须是特定于服务器的。OracleCommand和SQLCommand是DbCommands!DbCommand不能使用,它不是一个广义的东西,它是一个抽象的东西。今天,您更愿意通过ORM映射进行抽象,使用实体框架之类的东西,它将为您生成所有命令。
    var referenceValues = validRecords.Select(x => x.Reference).ToArray<string>();
    var fundDescriptionValues = validRecords.Select(x => x.FundDescription).ToArray<string>();
    var fundCodeValues = validRecords.Select(x => x.FundCode).ToArray<string>();

    OracleConnection con = new OracleConnection(oracleConnectionString);
    con.Open();

    OracleParameter referenceParam = new OracleParameter
    {
        OracleDbType = OracleDbType.Varchar2,
        Value = referenceValues
    };

    OracleParameter fundDescriptionParam = new OracleParameter
    {
        OracleDbType = OracleDbType.Varchar2,
        Value = fundDescriptionValues
    };

    OracleParameter fundCodeParam = new OracleParameter
    {
        OracleDbType = OracleDbType.Varchar2,
        Value = fundCodeValues
    };

    OracleCommand cmd = con.CreateCommand();

    cmd.CommandText = @"
                INSERT INTO FUND_IMPORT
                (
                    REFERENCE,
                    FUND_DESCRIPTION,
                    FUND_CODE
                )
                VALUES
                (
                    :1,
                    :2,
                    :3
                )";

    cmd.ArrayBindCount = referenceValues.Length;

    cmd.Parameters.Add(referenceParam);
    cmd.Parameters.Add(fundDescriptionParam);
    cmd.Parameters.Add(fundCodeParam);

    cmd.ExecuteNonQuery();

    con.Close();