【问题标题】:Queries in c# and access vba producing different resultsc# 中的查询和访问 vba 产生不同的结果
【发布时间】:2015-03-05 11:34:32
【问题描述】:

我正在编写一个 c#/.net4.0 程序来替换一个 access 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 中的行相对于日期时间 D1 的顺序完全不同。如果我按 D1 对表进行排序并比较两者的结果,则所有数据都是相同的,除了 100 行中的 11 行,其中 L1 和 L2 不同。仔细一看,除了这 11 行,数据都是一样的,因为日期时间是一样的,所以排序不正确。

问题是:在 Access/vba 和 c#/.net/ace.oledb.12.0 中执行相同查询之间,为什么查询插入行的顺序相对于 D1 不同?

【问题讨论】:

  • 你在 C# 代码中使用的是什么连接字符串?
  • 只是:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=pathtodb.mdb。会不会跟这有关系?
  • 在 C# 查询中,WHERE 子句之前不应该有一个额外的空格吗?
  • 是的,粘贴到这里的时候打错了。实际的 c# 查询有这个。
  • 在这个片段中 ...'rampup' AS Expr2 ... Expr2 是表达式 'rampup' 的别名。这就是您所说的“命名字段” 的意思吗?如果是这样,则由 db 引擎实现别名,并且无论查询是从 c# 还是 Access VBA 执行,别名都可以工作。

标签: c# sql .net vba ms-access


【解决方案1】:

为什么会以不同的顺序插入行并且在 vba 和 ace.oledb.12.0 之间会有所不同?

OLEDB 查询返回的数据顺序通常无法保证,除非您使用ORDER BY 子句指定它。由于 Access 直接查询自身,因此它可能确实保留了物理记录顺序。由于在执行 INSERT INTO ... SELECT 时无法指定顺序,因此无法强制插入顺序。

至于不同的结果,我会查看一个特定的结果并深入挖掘,在每个系统中运行一个非分组查询,看看您是否得到相同的记录,或者翻译是否存在差异。

附带说明,按常量值 ('" & stringUser & "', 'rampup') 分组是不必要的,但它不应该改变您的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多