繁体   English   中英

带或不带括号的 MS Access Sql 查询错误

[英]MS Access Sql query errors with or without brackets

我通常在 C# 工作,使用SQL Server Express数据库,但需要在另一个应用程序中使用MS Access 数据库复制一些查询。

在我的一种方法中,我使用 INNER JOIN 来连接 2 个表。 当我运行原始查询(如下所示的第一个查询)时,它会抛出以下错误。

IErrorInfo.GetDescription 因 E_FAIL (0x80004005) 而失败。

在调查此错误时,它建议我将列名(甚至可能是表名)放在方括号中。

但是,当代码到达我的 OleDbDataReader 时,它会抛出一个不同的错误“列名的括号无效”。

我已尝试 3 次更改查询的结构,如版本 #2 和 #3 所示。 但是,它继续出错。

请建议形成此参数化查询的正确方法。 原始查询#1

using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();
    using (OleDbCommand cmdGetPhone = new OleDbCommand(
        "SELECT s.GroupName, s.SpkrName, s.SpkrHomePhone, s.SpkrCellPhone, aIN.SpkrIN, aIN.GroupIN FROM Speakers AS s INNER JOIN AssignmentsIN AS aIN ON aIN.SpkrIN = s.SpkrName AND aIN.GroupIN = s.GroupName AND s.SpkrName = @SpkrName AND s.Local = @Local AND s.Visiting = @Visiting", conn))
    {
        cmdGetPhone.Parameters.Add("@SpkrName", OleDbType.VarWChar).Value = speaker;
        cmdGetPhone.Parameters.Add("@GroupIN", OleDbType.VarWChar).Value = group;
        cmdGetPhone.Parameters.Add("@Local", OleDbType.VarWChar).Value = local;
        cmdGetPhone.Parameters.Add("@Visiting", OleDbType.VarWChar).Value = visiting;
        using (OleDbDataReader reader = cmdGetPhone.ExecuteReader())
        {
            while (reader.Read())

查询#2

using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();
    using (OleDbCommand cmdGetPhone = new OleDbCommand(
        "SELECT [Speakers.GroupName], [Speakers.SpkrName], [Speakers.SpkrHomePhone], [Speakers.SpkrCellPhone], [AssignmentsIN.SpkrIN], [AssignmentsIN.GroupIN] FROM Speakers INNER JOIN AssignmentsIN ON [AssignmentsIN.SpkrIN] = [Speakers.SpkrName] AND [AssignmentsIN.GroupIN] = [Speakers.GroupName] AND [Speakers.SpkrName] = @SpkrName AND [Speakers.Local] = @Local AND [Speakers.Visiting] = @Visiting", conn))
    {
        cmdGetPhone.Parameters.Add("@SpkrName", OleDbType.VarWChar).Value = speaker;
        cmdGetPhone.Parameters.Add("@GroupIN", OleDbType.VarWChar).Value = group;
        cmdGetPhone.Parameters.Add("@Local", OleDbType.VarWChar).Value = local;
        cmdGetPhone.Parameters.Add("@Visiting", OleDbType.VarWChar).Value = visiting;
        using (OleDbDataReader reader = cmdGetPhone.ExecuteReader())
        {
            while (reader.Read())

查询#3

using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();
    using (OleDbCommand cmdGetPhone = new OleDbCommand(
        "SELECT s.GroupName, s.SpkrName, s.SpkrHomePhone, s.SpkrCellPhone, aIN.SpkrIN, aIN.GroupIN FROM (Speakers AS s INNER JOIN AssignmentsIN AS aIN ON aIN.SpkrIN = s.SpkrName AND aIN.GroupIN = s.GroupName AND s.SpkrName = @SpkrName AND s.Local = @Local AND s.Visiting = @Visiting)", conn))
    {
    cmdGetPhone.Parameters.Add("@SpkrName", OleDbType.VarWChar).Value = speaker;
    cmdGetPhone.Parameters.Add("@GroupIN", OleDbType.VarWChar).Value = group;
    cmdGetPhone.Parameters.Add("@Local", OleDbType.VarWChar).Value = local;
    cmdGetPhone.Parameters.Add("@Visiting", OleDbType.VarWChar).Value = visiting;
    using (OleDbDataReader reader = cmdGetPhone.ExecuteReader())
    {
        while (reader.Read())

您的第一个语法看起来不错。 你有:

SELECT s.GroupName, s.SpkrName, s.SpkrHomePhone, s.SpkrCellPhone, aIN.SpkrIN,
aIN.GroupIN FROM Speakers AS s 
INNER JOIN AssignmentsIN AS aIN ON 
aIN.SpkrIN = s.SpkrName 
AND aIN.GroupIN = s.GroupName 
AND s.SpkrName = @SpkrName 
AND s.Local = @Local 
AND s.Visiting = @Visiting

但是,您的参数是

@SpkrName   ok
@GroupIN    hum, I don't see that in above
@Local      ok
@Visiting   ok

所以,你的第一个 SQL 语法看起来不错(坚持下去 - 它很好)。 但似乎确实添加了一个额外的参数。 不确定,也许 sql 服务器不关心 sql 提供商,

使用 oleDB 提供程序? 好吧,它可能会有所不同。 还作为 FYI? 在使用 JET/ACE 时订购 MATTERS,所以请将它们放在 sql 中,并按照相同的顺序添加参数。 您的订单没问题(没有遗漏的订单)。

所以,一个 parms 看起来不见了。 我们假设观众和花生画廊的评论是关于一个可怕的错误信息,不要在这里说出来!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM