如何将数组数据绑定到SqlCommand.Parameter?

时间:2014-11-13 13:05:56

标签: c# sql .net sql-server sqlcommand

没有" foreach"可以执行此操作。 ???

我会理解是否有库函数将参数与数据列表相关联并执行N一起插入

 String SQL_DETAIL = "INSERT INTO [ImportDetail] " +
                                                      " ([idMaster] " +
                                                      " ,[operation] " +
                                                      " ,[data]) " +
                                                 " VALUES " +
                                                      " (@a,@b,@c) ";

foreach (ImportDetail imp in this.lstImportDetail )
{

     SqlCommand dettCommand = new SqlCommand(SQL_DETAIL, myTrans.Connection);
     dettCommand.Transaction = myTrans;

     dettCommand.Parameters.Add("a", SqlDbType.Int).Value = imp.IdMaster;
     dettCommand.Parameters.Add("b", SqlDbType.NVarChar).Value = imp.Operation;
     dettCommand.Parameters.Add("c", SqlDbType.NVarChar).Value = imp.Data;


     i =i+ (int)dettCommand.ExecuteNonQuery();
 }

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果您感觉活泼,可以创建用户定义的表格类型,并将所有ImportDetail个对象的数据放入DataTable。但这并不能完全减轻对循环的需求 - 它只是使它更有效率,因为你只是在内存中转换数据而不是将它传递给远程数据库。填充DataTable以匹配表类型的架构后,可以将其作为参数传递给存储过程以处理INSERT。如果您愿意,可以将该过程设置为事务性的,并且由于您的输入数据已经在表(各种)中,因此存储过程的SQL也应该非常简单。

有关用户定义的表类型及其在.NET中的使用方式的更多信息,请查看以下链接:http://msdn.microsoft.com/en-us/library/bb675163.aspx

更进一步,如果这是你必须经常做的事情,那么在IEnumerable上把它变成某种扩展方法以保持干燥的可能性并没有超出范围

这是您正在寻找的那种解决方案吗?考虑到问题的措辞,我有点难以说出来。

答案 1 :(得分:1)

您可以定义两个数组列表: 第一个将具有参数的名称,第二个将具有其值:

        ArrayList arrayName = new ArrayList { };
        ArrayList arrayValue = new ArrayList { };

        arrayName.Add("@Parameter1");
        arrayName.Add("@Parameter2");
        arrayValue.Add(value1);
        arrayValue.Add(value2);

        for (int i = 0; i < arrayName.Count; i++)
        {
        cmd.Parameters.AddWithValue(arrayName[i].ToString(), arrayValue[i]);
        }

然后执行命令