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

问题描述

我通常在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",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,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 server不在乎sql provider,

使用oleDB提供程序?好吧,可能有所不同。还可以作为参考吗?在使用JET / ACE时,请对MATTERS进行排序,因此请务必将它们放入sql中,并按照相同的顺序添加参数。您的订单确定(没有丢失的订单)。

因此,parms似乎丢失了。我们将假设观众和花生画廊对可怕且误导性错误消息的评论不在这里说出来!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...