我有一个对象数组。每个对象包含大约20个成员。我需要遍历数组并将对象中的数据插入到我的数据库中。有没有办法做到这一点,不要求我在我的循环体内放一个INSERT语句?我正在使用C#和SQL Server。
for(int i =0; i < arr.length; i++)
{
strSQL = "INSERT INTO myTable (field1...field20) VALUES (" + arr[i].field1 + "..." + arr[i].field20)
sqlCmd.execute(strSQL,sqlConn)
}
答案 0 :(得分:3)
为什么不使用linq?
答案 1 :(得分:1)
答案 2 :(得分:1)
享受
SqlCommand sqlcmd = null;
SqlParameter pField1 = new SqlParameter("@Field1", System.Data.SqlDbType.VarChar, 255);
...
SqlParameter pField20 = new SqlParameter("@Field20", System.Data.SqlDbType.VarChar, 255);
try{
sqlcmd = new SqlCommand("INSERT INTO myTable (field1...field20) VALUES (@Field1,...,@Field20)",sqlConn)
sqlcmd.Parameters.Add(pField1);
...
sqlcmd.Parameters.Add(pField20);
for(int i =0; i < arr.length; i++)
{
pField1.value = arr[i].field1;
...
pField20.value = arr[i].field20;
sqlCmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
LogError(ex.message)
}
finally
{
if (sqlconn != null && sqlconn.State != System.Data.ConnectionState.Closed)
sqlconn.Close();
if (sqlcmd != null)
sqlcmd.Dispose();
}
答案 3 :(得分:0)
对于简单命令,您可以使用格式字符串,如下所示:
//assuming that the first param is a number, the second one a string etc...
string insertFormat = @"Insert into myTable((field1...field20)
VALUES ({0},'{1}',..,19})"
for(int i =0; i < arr.length; i++)
{
//assuming that arr[i] is string[]
strSQL = string.Format(insertFormat, arr[i]);
sqlCmd.execute(strSQL,sqlConn)
}
但是,您必须意识到,您正在为SQL注入做好准备(强制xkcd)。为了避免这个问题和其他问题,你可以看一下“高级|解决方案(使用存储过程,使用反射来映射字段,使用一些ORM工具,使用Linq-to-sql等)
答案 4 :(得分:0)
strSQL = "INSERT INTO MYTABLE (COL01, COL01...COL42)";
for(int i = 0; i < arr.length; i++)
{
strSQL += "SELECT (" +arr[0] +", " +arr[1] +"..." +arr[42] +")";
if(i < arr.length - 1) {
strSQL += " UNION ALL ";
}
}
sqlCommand.Execute(strSQL, conn); // I forget how this bit goes, I am not a C# programmer by trade...
我发现一次插入超过500条记录会导致数据库运行缓慢。
答案 5 :(得分:0)
参数化存储过程。
将insert语句作为存储过程写入db中,并带有参数。
创建一个方法来填充存储过程,并将对象作为参数传入。
在循环中调用方法,每次填充传入对象实例。
答案 6 :(得分:0)
我有一个类似的问题,我发现处理它的最有效方法是为您的数据创建一个二维数组,并存储数组中每行数据的列名以及存储数据本身。
从那里开始循环并使用StringBuilder来组装查询是非常简单的。此外,不是简单地抛出插入值,而是在它们上面添加一个参数名称(我只使用了列名)。然后,在同一个循环中,您可以创建一个新的SqlParameter。
如果您使用的是.NET 4,只需创建一个SqlParameter数组,并在循环中将创建的参数添加到其中。循环结束后,您可以使用命令参数集合的“AddRange”方法将参数数组添加到命令中。
这样,您就可以构建一个完全动态的查询来清理输入。