简体   繁体   English

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

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

I normally work in C# with a SQL Server Express database, but need to duplicate some queries using an MS Access database in another application.我通常在 C# 工作,使用SQL Server Express数据库,但需要在另一个应用程序中使用MS Access 数据库复制一些查询。

In one of my methods, I am using an INNER JOIN to join 2-tables.在我的一种方法中,我使用 INNER JOIN 来连接 2 个表。 When I run my original query, the first query shown below, it throws the following error.当我运行原始查询(如下所示的第一个查询)时,它会抛出以下错误。

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

In investigating this error, it suggested that I place brackets around the column names (perhaps even the table name).在调查此错误时,它建议我将列名(甚至可能是表名)放在方括号中。

However, when the code reaches my OleDbDataReader, it then throws a different error ' Invalid bracketing of column name '.但是,当代码到达我的 OleDbDataReader 时,它会抛出一个不同的错误“列名的括号无效”。

I have tried 3-times to change the structure of my query, as shown in versions #2 and #3.我已尝试 3 次更改查询的结构,如版本 #2 和 #3 所示。 However, it continues to error.但是,它继续出错。

Please suggest the correct way to form this parameterized query.请建议形成此参数化查询的正确方法。 Original query#1原始查询#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())

Query#2查询#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())

Query#3查询#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())

Your first syntax looks fine.您的第一个语法看起来不错。 You have:你有:

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

However, your params are但是,您的参数是

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

So, your first SQL syntax looks fine (stick with it - it just fine).所以,你的第一个 SQL 语法看起来不错(坚持下去 - 它很好)。 But it does seem a extra parameter is being added.但似乎确实添加了一个额外的参数。 Not sure, maybe sql server don't care with sql provider,不确定,也许 sql 服务器不关心 sql 提供商,

With oleDB provider?使用 oleDB 提供程序? Well, it might be different.好吧,它可能会有所不同。 And also as a FYI?还作为 FYI? Order MATTERS when using JET/ACE, so do put them in the sql, and add params as in the SAME order.在使用 JET/ACE 时订购 MATTERS,所以请将它们放在 sql 中,并按照相同的顺序添加参数。 Your order is ok (sans the missing one).您的订单没问题(没有遗漏的订单)。

So, a parms looks to be missing.所以,一个 parms 看起来不见了。 We shall assume comments from spectators and the peanut gallery about a horrid and miss-leading error message to not speak out here!我们假设观众和花生画廊的评论是关于一个可怕的错误信息,不要在这里说出来!

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

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