将数据从对象插入数据库

时间:2011-01-24 14:35:53

标签: c# sql-server

我有一个对象数组。每个对象包含大约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)
}

7 个答案:

答案 0 :(得分:3)

为什么不使用linq

答案 1 :(得分:1)

是的,有办法。

首先,+1为lollancf37的答案。

其次,您可以使用StringBuilder。使用StringBuilder使用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)

参数化存储过程。

  1. 将insert语句作为存储过程写入db中,并带有参数。

  2. 创建一个方法来填充存储过程,并将对象作为参数传入。

  3. 在循环中调用方法,每次填充传入对象实例。

答案 6 :(得分:0)

我有一个类似的问题,我发现处理它的最有效方法是为您的数据创建一个二维数组,并存储数组中每行数据的列名以及存储数据本身。

从那里开始循环并使用StringBuilder来组装查询是非常简单的。此外,不是简单地抛出插入值,而是在它们上面添加一个参数名称(我只使用了列名)。然后,在同一个循环中,您可以创建一个新的SqlParameter。

如果您使用的是.NET 4,只需创建一个SqlParameter数组,并在循环中将创建的参数添加到其中。循环结束后,您可以使用命令参数集合的“AddRange”方法将参数数组添加到命令中。

这样,您就可以构建一个完全动态的查询来清理输入。

相关问题