9

我正在尝试在 C# 的循环中插入数据库记录。

当我对这样的值进行硬编码时,它会起作用:

    string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (222,333);";
    SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
    sqlConnection3.Open();

    for (int i = 0; i < arrItemsPlanner.Length; i++)
    {
        try
            {
                cmd3.ExecuteNonQuery();
            }
            catch
            {
                return "Error: Item could not be saved";
            }
            finally
            {
                //Fail
            }
        }

但是当我使用参数化查询时它不起作用 - 即使我将一个值硬编码到参数化查询中,如下所示:

    string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);";
    SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
    sqlConnection3.Open();

    for (int i = 0; i < arrItemsPlanner.Length; i++)
    {
        try
            {
                cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int);
                cmd3.Parameters["@room_id"].Value = 222;
                cmd3.ExecuteNonQuery();
            }
            catch
            {
                return "Error: Item could not be saved";
            }
            finally
            {
                //Fail
            }
        }

谁能看到我要去哪里错了?

非常感谢!

4

7 回答 7

7

经过测试和简单的解决方案。如果您在循环中使用参数 您需要在执行查询后清除参数。所以你可以使用它

cmd3.executeNonQuery();
cmd3.Parameters.Clear();
于 2014-01-01T09:56:16.677 回答
6

看起来您正在一遍又一遍地添加到命令的参数集合中。每次迭代都清除它。

我还建议抛出实际的异常,以便您了解问题所在。

于 2012-01-05T17:42:59.217 回答
3

这是未经测试的,但应该可以作为替代方案。只需添加一次并不断更新其值。

....
cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int);

for (int i = 0; i < arrItemsPlanner.Length; i++)
{
    try
        {
            cmd3.Parameters["@room_id"].Value = 222;
            cmd3.ExecuteNonQuery();
        }
....

顺便说一句,你SqlCommand应该在一个using块内以及你的SqlConnection. 没有显示完整的代码,所以我不知道你的连接是否真的以这种方式完成。

using (var conn = new SqlConnection(...))
using (var cmd = new SqlCommand(..., conn))
{

}
于 2012-01-05T17:46:14.310 回答
1

您正在做的是添加一个参数 ever 循环迭代。在下面的代码中,它添加了一次参数,只修改了单个参数的值。试试这个:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);"; 
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
cmd3.Parameters.Add("@room_id", SqlDbType.Int);

sqlConnection3.Open(); 

for (int i = 0; i < arrItemsPlanner.Length; i++) 
{ 
    try 
        { 
            cmd3.Parameters["@room_id"].Value = 222; 
            cmd3.ExecuteNonQuery(); 
        } 
        catch 
        { 
            return "Error: Item could not be saved"; 
        } 
        finally 
        { 
            //Fail 
        } 
    } 
于 2012-01-05T17:44:31.833 回答
1

是的,不要在循环中添加参数,只设置它的值:

string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);";
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
sqlConnection3.Open();

cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int);

for (int i = 0; i < arrItemsPlanner.Length; i++)
{
    try
        {
            cmd3.Parameters["@room_id"].Value = 222;
            cmd3.ExecuteNonQuery();
        }
        catch
        {
            return "Error: Item could not be saved";
        }
        finally
        {
            //Fail
        }
    }
于 2012-01-05T17:45:14.327 回答
1
cmd3.Parameters.Add("room_id", System.Data.SqlDbType.Int);

// 不要一直在循环中添加它

cmd3.Parameters["room_id"].Value = 222; 

使用 sql server 时参数集合中没有 @needed

于 2012-01-05T17:45:45.153 回答
0

对于那些正在查看此线程的人的另一种解决方案。创建两个连接。一个用于您的循环,另一个用于发送您的 NonQuery 语句。这对我有用。

于 2016-10-24T17:05:27.467 回答