【发布时间】: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 执行,别名都可以工作。