c# 中的查询和访问 vba 产生不同的结果
Queries in c# and access vba producing different results
我正在编写一个 c#/.net4.0 程序来替换访问 vba 模块。我运行相同的查询得到不同的结果。
vba查询:
dbs.Execute "INSERT INTO tmpTable ( L1, D1, L2, UserID, FmN ) " & _
"SELECT Table1.Field1, Table2.Field1, " & _
"Sum(Table2.Field2) AS SumOfNoWork, '" & stringUser & "' AS Expr1, 'rampup' AS Expr2 " & _
"FROM Table1 INNER JOIN Table2 ON Table1.Field2 = Table2.Field3 " & _
"WHERE (((Table2.Field4) = 6)) " & _
"GROUP BY Table1.Field1, Table2.Field1, '" & stringUser & "', 'rampup';"
c#查询:
string exec1 = "INSERT INTO tmpTable ( L1, D1, L2, UserID, FmN ) " +
"SELECT Table1.Field1, Table2.Field1, " +
"Sum(Table2.Field2) AS SumOfNoWork, '" + stringUser + "' AS Expr1, 'rampup' AS Expr2 " +
"FROM Table1 INNER JOIN Table2 ON Table1.Field2 = Table2.Field3 " +
"WHERE (((Table2.Field4) = 6)) " +
"GROUP BY Table1.Field1, Table2.Field1, '" & stringUser & "', 'rampup';";
using (OleDbConnection conn = new OleDbConnection(strconn))
{ conn.Open(); OleDbCommand comm = new OleDbCommand(exec1, conn);
comm.ExecuteNonQuery(); conn.Close(); }
我比较了两者运行后的结果。从插入查询中查看 tempTable,字段 D1 和 FmN 相同,但在 100 行中的 11 行中,c# 和 vba 版本的 L1 和 L2 不同。此外,它们的插入顺序不同。
c#版本没有任何异常,但这会不会是访问表达式服务的结果? vba 和 ace.oledb.12.0 之间为什么会以不同的顺序插入行以及一些不同的原因?
编辑: 我发现了一些我之前没有注意到的东西——L1 和 L2 是长整数类型,D1 是日期时间,userid 和 fmn 是字符串。执行这些之后,插入到 tmpTable 中的行相对于 datetime D1 的顺序完全不同。如果我按 D1 对 table 进行排序并比较两者的结果,除了 100 行中的 11 行之外,所有数据都是相同的,其中 L1 和 L2 不同。仔细查看后,数据是相同的,除了这 11 行的日期时间相同,因此它们没有正确排序。
问题是:为什么在 Access/vba 和 c#/.net/ace.oledb.12.0?
Any reasons why the rows would be inserted in a different order and some different between vba and ace.oledb.12.0?
通常无法保证 OLEDB 查询返回的数据顺序,除非您使用 ORDER BY
子句指定它。由于 Access 直接查询自身,因此它很可能会保留物理记录顺序。由于在执行 INSERT INTO ... SELECT
时无法指定顺序,因此无法强制执行插入顺序。
至于不同的结果,我会看一个特定的结果并深入挖掘,运行每个系统中的非分组查询,看看你是否得到相同的记录或者是否存在差异在翻译中。
附带说明一下,按常量值 ('" & stringUser & "', 'rampup'
) 分组是不必要的,但它不会改变您的结果。
我正在编写一个 c#/.net4.0 程序来替换访问 vba 模块。我运行相同的查询得到不同的结果。
vba查询:
dbs.Execute "INSERT INTO tmpTable ( L1, D1, L2, UserID, FmN ) " & _
"SELECT Table1.Field1, Table2.Field1, " & _
"Sum(Table2.Field2) AS SumOfNoWork, '" & stringUser & "' AS Expr1, 'rampup' AS Expr2 " & _
"FROM Table1 INNER JOIN Table2 ON Table1.Field2 = Table2.Field3 " & _
"WHERE (((Table2.Field4) = 6)) " & _
"GROUP BY Table1.Field1, Table2.Field1, '" & stringUser & "', 'rampup';"
c#查询:
string exec1 = "INSERT INTO tmpTable ( L1, D1, L2, UserID, FmN ) " +
"SELECT Table1.Field1, Table2.Field1, " +
"Sum(Table2.Field2) AS SumOfNoWork, '" + stringUser + "' AS Expr1, 'rampup' AS Expr2 " +
"FROM Table1 INNER JOIN Table2 ON Table1.Field2 = Table2.Field3 " +
"WHERE (((Table2.Field4) = 6)) " +
"GROUP BY Table1.Field1, Table2.Field1, '" & stringUser & "', 'rampup';";
using (OleDbConnection conn = new OleDbConnection(strconn))
{ conn.Open(); OleDbCommand comm = new OleDbCommand(exec1, conn);
comm.ExecuteNonQuery(); conn.Close(); }
我比较了两者运行后的结果。从插入查询中查看 tempTable,字段 D1 和 FmN 相同,但在 100 行中的 11 行中,c# 和 vba 版本的 L1 和 L2 不同。此外,它们的插入顺序不同。
c#版本没有任何异常,但这会不会是访问表达式服务的结果? vba 和 ace.oledb.12.0 之间为什么会以不同的顺序插入行以及一些不同的原因?
编辑: 我发现了一些我之前没有注意到的东西——L1 和 L2 是长整数类型,D1 是日期时间,userid 和 fmn 是字符串。执行这些之后,插入到 tmpTable 中的行相对于 datetime D1 的顺序完全不同。如果我按 D1 对 table 进行排序并比较两者的结果,除了 100 行中的 11 行之外,所有数据都是相同的,其中 L1 和 L2 不同。仔细查看后,数据是相同的,除了这 11 行的日期时间相同,因此它们没有正确排序。
问题是:为什么在 Access/vba 和 c#/.net/ace.oledb.12.0?
Any reasons why the rows would be inserted in a different order and some different between vba and ace.oledb.12.0?
通常无法保证 OLEDB 查询返回的数据顺序,除非您使用 ORDER BY
子句指定它。由于 Access 直接查询自身,因此它很可能会保留物理记录顺序。由于在执行 INSERT INTO ... SELECT
时无法指定顺序,因此无法强制执行插入顺序。
至于不同的结果,我会看一个特定的结果并深入挖掘,运行每个系统中的非分组查询,看看你是否得到相同的记录或者是否存在差异在翻译中。
附带说明一下,按常量值 ('" & stringUser & "', 'rampup'
) 分组是不必要的,但它不会改变您的结果。