【问题标题】:Writing Data to Access Database with foreach使用 foreach 将数据写入访问数据库
【发布时间】:2019-12-29 16:42:30
【问题描述】:

我有一个要写入数据的 Access 数据库。我在测试期间成功地这样做了,但是我试图将我的代码转换为迭代且高效地运行,因为我打算一次处理来自 API 响应的多达 10K 查询。

我的尝试

我能够使用以下命令成功写入我的 Access 数据库

            using (OleDbConnection myCon = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Lenovo\\Desktop\\Weather Cruncher\\wcMainDB.accdb"))
            {
                OleDbCommand cmd = new OleDbCommand();
                cmd.CommandText = "Insert into stations_NOAA " +
                    "([stationID],[stationName],[stationMinDate],[stationMaxDate],[stationDataCoverage]," +
                    "[stationLatitude],[stationLongitude],[stationElevation],[stationElevationUnit])" +
                    "values (?,?,?,?,?,?,?,?,?)";
                cmd.Parameters.AddWithValue("@stationID", "1000"); // Short Text data type
                cmd.Parameters.AddWithValue("@stationName", "2000"); // Short Text data type
                cmd.Parameters.AddWithValue("@stationMinDate", "3000"); // Short Text data type
                cmd.Parameters.AddWithValue("@stationMaxDate", "4000"); // Short Text data type
                cmd.Parameters.AddWithValue("@stationDataCoverage", 5000); // Number data type
                cmd.Parameters.AddWithValue("@stationLatitude", 6000); // Number data type
                cmd.Parameters.AddWithValue("@stationLongitude", 7000); // Number data type
                cmd.Parameters.AddWithValue("@stationElevation", 8000); // Number data type
                cmd.Parameters.AddWithValue("@stationElevationUnit", "9000"); // Short Text data type
                cmd.Connection = myCon;
                myCon.Open();
                cmd.ExecuteNonQuery();
            }

我能够编写 API 对控制台的响应:

                foreach (Station loc in noaa.results)
                {
                    Console.WriteLine(loc.id);
                    Console.WriteLine(loc.name);
                    Console.WriteLine(loc.mindate);
                    Console.WriteLine(loc.maxdate);
                    Console.WriteLine(loc.datacoverage);
                    Console.WriteLine(loc.latitude);
                    Console.WriteLine(loc.longitude);
                    Console.WriteLine(loc.elevation);
                    Console.WriteLine(loc.elevationUnit);
                    Console.WriteLine();
                }
                /* Output
                    GHCND:CA001165793
                    100 MILE HOUSE 6 NE, CA
                    1987-06-01
                    2019-11-09
                    1
                    51.6833
                    -121.2167
                    928
                    METERS

                    GHCND:CA001165791
                    100 MILE HOUSE, CA
                    1970-05-01
                    1999-11-30
                    0.9993
                    51.65
                    -121.3
                    1059
                    METERS
                */

我的实际问题

在确认过程后,我尝试用以下代码迭代地编写我的 API 响应,但没有成功,也没有报错:

            using (OleDbConnection myCon = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Lenovo\\Desktop\\Weather Cruncher\\wcMainDB.accdb"))
            {
                OleDbCommand cmd = new OleDbCommand();
                cmd.CommandText = "Insert into stations_NOAA " +
                    "([stationID],[stationName],[stationMinDate],[stationMaxDate],[stationDataCoverage]," +
                    "[stationLatitude],[stationLongitude],[stationElevation],[stationElevationUnit])" +
                    "values (?,?,?,?,?,?,?,?,?)";
                cmd.Connection = myCon;
                myCon.Open();

                // Populate Datagrid
                foreach (Station loc in noaa.results)
                {
                    cmd.Parameters.AddWithValue("@stationID", loc.id); // Short Text data type
                    cmd.Parameters.AddWithValue("@stationName", loc.name); // Short Text data type
                    cmd.Parameters.AddWithValue("@stationMinDate", loc.mindate); // Short Text data type
                    cmd.Parameters.AddWithValue("@stationMaxDate", loc.maxdate); // Short Text data type
                    cmd.Parameters.AddWithValue("@stationDataCoverage", loc.datacoverage); // Number data type
                    cmd.Parameters.AddWithValue("@stationLatitude", loc.latitude); // Number data type
                    cmd.Parameters.AddWithValue("@stationLongitude", loc.longitude); // Number data type
                    cmd.Parameters.AddWithValue("@stationElevation", loc.elevation); // Number data type
                    cmd.Parameters.AddWithValue("@stationElevationUnit", loc.elevationUnit); // Short Text data type

                }
            }

使用断点,我可以看到它遍历上述内容,但没有发现任何数据添加到 Access 数据库中。我的查询出了点问题 - 怎么办?

【问题讨论】:

    标签: c# oledb


    【解决方案1】:

    最后一个示例中每个循环的内部没有显示您在设置参数后调用 cmd.excecutenonquery()

    您可能应该在每个循环的内部实例化一个新的 cmd 对象。

    【讨论】:

      【解决方案2】:
         using (OleDbConnection myCon = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Lenovo\\Desktop\\Weather Cruncher\\wcMainDB.accdb"))
              {
                  OleDbCommand cmd = new OleDbCommand();
                  cmd.CommandText = "Insert into stations_NOAA " +
                      "([stationID],[stationName],[stationMinDate],[stationMaxDate],[stationDataCoverage]," +
                      "[stationLatitude],[stationLongitude],[stationElevation],[stationElevationUnit])" +
                      "values (?,?,?,?,?,?,?,?,?)";
                  cmd.Connection = myCon;
                  myCon.Open();
      
                  // Populate Datagrid
                  foreach (Station loc in noaa.results)
                  {
                      cmd.Parameters.AddWithValue("@stationID", loc.id); // Short Text data type
                      cmd.Parameters.AddWithValue("@stationName", loc.name); // Short Text data type
                      cmd.Parameters.AddWithValue("@stationMinDate", loc.mindate); // Short Text data type
                      cmd.Parameters.AddWithValue("@stationMaxDate", loc.maxdate); // Short Text data type
                      cmd.Parameters.AddWithValue("@stationDataCoverage", loc.datacoverage); // Number data type
                      cmd.Parameters.AddWithValue("@stationLatitude", loc.latitude); // Number data type
                      cmd.Parameters.AddWithValue("@stationLongitude", loc.longitude); // Number data type
                      cmd.Parameters.AddWithValue("@stationElevation", loc.elevation); // Number data type
                      cmd.Parameters.AddWithValue("@stationElevationUnit", loc.elevationUnit); // Short Text data type
                      cmd.ExecuteNonQuery();
                      cmd.Parameters.Clear();
                  }
              }
      

      您忘记拨打cmd.ExecuteNonQuery();

      如果这种方法不起作用,您需要将 cmd 变量定义放在 foreach 循环中。

      编辑:如图here,每次迭代后都要清除参数。

      【讨论】:

        猜你喜欢
        • 2011-08-19
        • 1970-01-01
        • 2012-04-04
        • 2013-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-28
        相关资源
        最近更新 更多