使用 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,每次迭代后应清除参数。
我有一个要写入数据的 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();
}
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,每次迭代后应清除参数。