使用 foreach 将数据写入 Access 数据库

Writing Data to Access Database with foreach

我有一个要写入数据的 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 数据库中。我的查询有问题 - 怎么办?

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

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

   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,每次迭代后应清除参数。