我在Access db中具有表(大约25万行),其中包含日期,时间和名称(其他列与该问题无关)。我只需要获取名字的第一个(或最后一个)日期/时间并将其发送到新表即可。
我尝试了SQL语句,但是对于大量的行,它太慢了。 此处:Access SQL to return only first or last occurence by date
我还尝试将数据从db读取到DataTable,遍历并删除不需要的行,但是无法将经过编辑的DataTable发送回db。与此类似:How do I insert a datatable into Microsoft Access?
using(OleDbConnection con = new OleDbConnection(ConnectionString))
{
SQL = "Select * From OriginalTable";
var adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(SQL, con);
var cbr = new OleDbCommandBuilder(adapter);
try
{
con.Open();
DataTable dtFilter = new DataTable();
adapter.Fill(dtFilter);
string id = dtFilter.Rows[dtFilter.Rows.Count - 1][4].ToString();
for(int i = dtFilter.Rows.Count - 2; i >= 0; i--)
{
DataRow dr = dtFilter.Rows[i];
if(dtFilter.Rows[i][4].ToString() == id)
{
dr.Delete();
}
else
{
id = dtFilter.Rows[i][4].ToString();
}
}
dtFilter.AcceptChanges(); // DataTable looks as I want
adapter.Update(dtFilter); // Returns 0
}
catch(OleDbException ex)
{
MessageBox.Show(ex.Message, "OledbException Error");
}
catch(Exception x)
{
MessageBox.Show(x.Message, "Exception Error");
}
}
我希望将dtFilter导出到Access db。为什么返回0?
只要速度很快,我就愿意接受SQL语句。
更新: 用于选择第一个或最后一个条目的SQL语句
SELECT DISTINCT
cdate(Format(t.DateOS + t.TimeOS, 'dd.MM.yyyy HH:mm:ss')) AS DateTimeOS,
cdate(Format(t.DateOS, 'dd.MM.yyyy ')) AS DateOS,
cdate(Format(t.TimeOS, 'HH:mm:ss')) AS TimeOS,
t.EP AS EP, t.ID AS ID
FROM TestFirstLast AS t
WHERE t.EP = 'L100'
AND (((t.DateOS + t.TimeOS) > #1/1/2016 12:00:00 AM# AND (t.DateOS + t.TimeOS) <= #3/1/2016 12:00:00 AM#))
AND NOT EXISTS(SELECT 1 FROM TestFirstLast AS t2 WHERE t2.EP = t.EP AND t2.ID = t.ID AND (t2.DateOS < t.DateOS OR t2.DateOS = t.DateOS AND t2.TimeOS < t.TimeOS))
好的解决方案: 我找到了关于问题和解决方法here
的很好的描述答案 0 :(得分:0)
要使用 .Update 方法,您必须提供一个更新SQL命令。
OleDbDataAdapter提供
如果您没有设置相应的命令,则DataAdapter将不知道如何处理您的数据。