C# 使用多个循环向SQL Server数据库插入行

C# 使用多个循环向SQL Server数据库插入行,c#,sql-server,C#,Sql Server,我正在收集要存储在数据库表中的用户及其信息的列表。我在Microsoft SQL Server Management Studio中设置了此数据库。数据库的主键设置为自动递增。我需要在列表中没有更多用户时结束循环。我在测试帐户中有两个有效用户,但是我当前的帐户只插入一个用户。我最好使用sqlDataAdapter List<User> result = ims.ListUsers(req).ListUsersResult.Users; SqlConnection connectio

我正在收集要存储在数据库表中的用户及其信息的列表。我在Microsoft SQL Server Management Studio中设置了此数据库。数据库的主键设置为自动递增。我需要在列表中没有更多用户时结束循环。我在测试帐户中有两个有效用户,但是我当前的帐户只插入一个用户。我最好使用
sqlDataAdapter

List<User> result = ims.ListUsers(req).ListUsersResult.Users;

SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ConnectionString);

for (int i = 1; i < result.Count(); i++)
{
    foreach (User user in result.Where(x => x.UserName.Contains('@')))
    {
        string sql = @"INSERT INTO UserInfo (UserID, UserName) VALUES (@UserID, @UserName)";

        using (SqlCommand command = new SqlCommand(sql, connection))
        {
            command.Parameters.AddWithValue("@UserID", i);
            command.Parameters.AddWithValue("@UserName", user.UserName);

            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();
        }
    }
}
List result=ims.ListUsers(req).ListUsersResult.Users;
SqlConnection连接=新的SqlConnection(ConfigurationManager.ConnectionString[“默认”].ConnectionString);
for(int i=1;ix.UserName.Contains('@'))中的用户)
{
字符串sql=@“插入UserInfo(UserID,UserName)值(@UserID,@UserName)”;
使用(SqlCommand=newsqlcommand(sql,连接))
{
command.Parameters.AddWithValue(“@UserID”,i);
command.Parameters.AddWithValue(“@UserName”,user.UserName);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
}
}

我不明白为什么您需要外部
for循环来创建ID,因为您不应该手动设置主键列。它将自动递增。完成后,还应始终关闭连接

以下是完整的代码:

string sql = @"INSERT INTO UserInfo (UserName) VALUES (@UserName)";
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ConnectionString))
using(var cmd = new SqlCommand(sql, con))
{
    con.Open();
    foreach(var user in result.Where(x => x.UserName.Contains('@')))
    {
        // you don't need to set the UserID when you've set made it an Identity column
        cmd.Parameters.AddWithValue("@UserName", user.UserName);
        cmd.ExecuteNonQuery();
    }
}

我不明白为什么您需要外部
for循环
来创建ID,因为您不应该手动设置主键列。它将自动递增。完成后,还应始终关闭连接

以下是完整的代码:

string sql = @"INSERT INTO UserInfo (UserName) VALUES (@UserName)";
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ConnectionString))
using(var cmd = new SqlCommand(sql, con))
{
    con.Open();
    foreach(var user in result.Where(x => x.UserName.Contains('@')))
    {
        // you don't need to set the UserID when you've set made it an Identity column
        cmd.Parameters.AddWithValue("@UserName", user.UserName);
        cmd.ExecuteNonQuery();
    }
}

我认为您需要替换:

for (int i = 1; i < result.Count(); i++)
for(int i=1;i
与:

for(int i=0;i
我认为您需要更换:

for (int i = 1; i < result.Count(); i++)
for(int i=1;i
与:

for(int i=0;i
您的问题是有两个循环。您需要删除第一个for循环,并在每次通过foreach()执行时增加一个int变量

您正在添加具有相同用户ID的多个用户

int userID = 1

foreach (User user in result.Where(x => x.UserName.Contains('@')))
{
    // your code

    userID++;
}

你的问题是你有两个循环。您需要删除第一个for循环,并在每次通过foreach()执行时增加一个int变量

您正在添加具有相同用户ID的多个用户

int userID = 1

foreach (User user in result.Where(x => x.UserName.Contains('@')))
{
    // your code

    userID++;
}

您不需要更新自动递增字段,它将由SQL server自动计数。请尝试以下代码:

        List<User> result = ims.ListUsers(req).ListUsersResult.Users;

        SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ConnectionString);

        foreach (User user in result.Where(x => x.UserName.Contains('@')))
        {
            string sql = @"INSERT INTO UserInfo (UserName) VALUES (@UserName)";

            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                command.Parameters.AddWithValue("@UserName", user.UserName);
                connection.Open();
                command.ExecuteNonQuery();
                connection.Close();
            }
        }
List result=ims.ListUsers(req).ListUsersResult.Users;
SqlConnection连接=新的SqlConnection(ConfigurationManager.ConnectionString[“默认”].ConnectionString);
foreach(result.Where(x=>x.UserName.Contains('@'))中的用户)
{
字符串sql=@“插入用户信息(用户名)值(@UserName)”;
使用(SqlCommand=newsqlcommand(sql,连接))
{
command.Parameters.AddWithValue(“@UserName”,user.UserName);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
}

您不需要更新自动递增字段,它将由SQL server自动计数。请尝试以下代码:

        List<User> result = ims.ListUsers(req).ListUsersResult.Users;

        SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ConnectionString);

        foreach (User user in result.Where(x => x.UserName.Contains('@')))
        {
            string sql = @"INSERT INTO UserInfo (UserName) VALUES (@UserName)";

            using (SqlCommand command = new SqlCommand(sql, connection))
            {
                command.Parameters.AddWithValue("@UserName", user.UserName);
                connection.Open();
                command.ExecuteNonQuery();
                connection.Close();
            }
        }
List result=ims.ListUsers(req).ListUsersResult.Users;
SqlConnection连接=新的SqlConnection(ConfigurationManager.ConnectionString[“默认”].ConnectionString);
foreach(result.Where(x=>x.UserName.Contains('@'))中的用户)
{
字符串sql=@“插入用户信息(用户名)值(@UserName)”;
使用(SqlCommand=newsqlcommand(sql,连接))
{
command.Parameters.AddWithValue(“@UserName”,user.UserName);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
}

既然PK UserID是自动增加的,为什么要用值插入它?第二次运行时将生成异常。我不明白为什么要使用
for
循环。似乎,
foreach
正在做您需要的一切。既然PK UserID是自动增加的,为什么要将其与值一起插入?第二次运行时将生成异常。我不明白为什么要使用
for
循环。看来,
foreach
正在做你需要的一切。你的第一个答案是错误的,这不会有帮助,直到有两个循环,他正在更新自动递增字段。这对我来说是个好办法。我感谢你的帮助。只是其中一个星期五!再次感谢@谢尔盖:是的,你说得对。for循环只是冗余的。编辑了我的答案。还从插入结构中删除了UserId部分。我也这样做了。谢谢你。你的第一个答案是错误的,这将不会有帮助,直到有两个循环,他正在更新自动递增字段。这为我做了诀窍。我感谢你的帮助。只是其中一个星期五!再次感谢@谢尔盖:是的,你说得对。for循环只是冗余的。编辑了我的答案。还从插入结构中删除了UserId部分。我也这样做了。非常感谢。