【问题标题】:from list<> to database records is repeating从列表<> 到数据库记录重复
【发布时间】:2013-12-06 00:32:25
【问题描述】:

我有以下代码来创建一个包含三个记录的列表,并用这个列表填充一个访问数据库。它可以工作,但数据库会用列表的第一条记录填充三次,即重复行。任何帮助将不胜感激。谢谢

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.OleDb;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            var list = new List<Project>(){
                new Project{ProjectId="ID1",ProjectName="AAAA"}, 
                new Project{ProjectId="ID2",ProjectName="BBBB"},
                new Project{ProjectId="ID3",ProjectName="CCCC"},
            };


            string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\td\Desktop\Test2.accdb";
            OleDbConnection con = new OleDbConnection(connectionString);
            string accessQuery = "INSERT INTO [table] (ProjectId, ProjectName) VALUES (@ProjectId, @ProjectName)";
            OleDbCommand cmd = new OleDbCommand(accessQuery, con);

            con.Open();


            for (int i = 0; i < list.Count; i++)
            {
                cmd.Parameters.AddWithValue("@ProjectId", list[i].ProjectId);
                cmd.Parameters.AddWithValue("@ProjectName", list[i].ProjectName);
                cmd.ExecuteNonQuery();
            }

        }
    }

    public class Project
    {
        public string ProjectId { get; set; }
        public string ProjectName { get; set; }
    }
}

【问题讨论】:

  • 因为你得到了第 3 条记录,而你根本没有得到第 2 条和第 3 条记录?
  • ID1,AAAA ID1,AAAA ID1,AAAA

标签: c# sql oledb ado


【解决方案1】:

您正在 for 循环之外创建命令,然后尝试将参数添加到同一命令。我猜当你为 i > 0 调用 cmd.Parameters.AddWithValue 时,这些值会被默默地忽略。试试

string accessQuery = "INSERT INTO [table] (ProjectId, ProjectName) VALUES (@ProjectId, @ProjectName)";
OleDbCommand cmd = new OleDbCommand(accessQuery, con);    
con.Open();

for (int i = 0; i < list.Count; i++)
{
    cmd.Parameters.Clear();
    cmd.Parameters.AddWithValue("@ProjectId", list[i].ProjectId);
    cmd.Parameters.AddWithValue("@ProjectName", list[i].ProjectName);
    cmd.ExecuteNonQuery();
}

如果这不起作用(不是在我的开发机器上,我现在无法测试),您可以随时将命令创建移动到您的 for 循环中,而其他一切都保持不变。

【讨论】:

  • 你才是男人!!!我移动了 OleDbCommand cmd = new OleDbCommand(accessQuery, con);在循环内部,它与我以前的代码一起工作。
  • Derp,对。当然,Parameters[key] 需要一个实际的 OleDbParameter 对象。考虑更多最好的选择可能是将命令留在外面,但将 cmd.Parameters.Clear() 作为 for 循环内的第一行调用。
  • 这也有效....我花了大约 5 个小时试图解决它,但没有运气....我不知道如何感谢你。
  • 呃,这证明会分散家务。这对我来说已经足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2020-12-12
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
相关资源
最近更新 更多