Search code examples
c#oledb

Writing Data to Access Database with foreach


I have an Access Database which I want to write data. I am successful in doing so during my tests, however am trying to convert my code to run iteratively and efficiently as I intend to process up to ~10K queries at a time from an API response.

What I've tried

I was able to successfully write to my Access database with the following

            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();
            }

enter image description here I am able to write the API's response to console:

                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
                */

My actual issue

After confirming the process, I then tried to iteratively write my API response with the following, which didn't work and threw no errors:

            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

                }
            }

With break-points, I was able to watch it iterate through the above but found no data added to the Access Database. Something is wrong with my query- what though?


Solution

  •    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();
                }
            }
    

    You forget to call cmd.ExecuteNonQuery();.

    If this approach doesn't work you'll need to put the cmd variable definition inside the foreach loop.

    Edit: as shown here, you should clear the parameters after each iteration.