C# OLEDBEException:未定义参数时,未为参数指定值

C# OLEDBEException:未定义参数时,未为参数指定值,c#,oledb,C#,Oledb,我在开发的应用程序上运行测试时遇到OLEDBEException。给出的错误消息是:“没有为一个或多个必需参数提供值。” 我知道这个问题似乎在这个网站上被问了好几次,但在每一种情况下,问题都是在执行UPDATE命令时出现的。在我的SELECT命令中抛出我的错误;更让人困惑的是,我甚至没有尝试使用参数,所以我不确定它需要什么参数。引发异常的方法的代码如下: // Array of column letters, used in constructing the select query. priv

我在开发的应用程序上运行测试时遇到OLEDBEException。给出的错误消息是:“没有为一个或多个必需参数提供值。”

我知道这个问题似乎在这个网站上被问了好几次,但在每一种情况下,问题都是在执行
UPDATE
命令时出现的。在我的
SELECT
命令中抛出我的错误;更让人困惑的是,我甚至没有尝试使用参数,所以我不确定它需要什么参数。引发异常的方法的代码如下:

// Array of column letters, used in constructing the select query.
private readonly string[] COLUMN_LABELS = new string[] { "AS", "AT", "AU", "AV", "AW", "AX", "AY", "AZ", "BA", "BB",
                                                        "BC", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BK", "BL",
                                                        "BM", "BN", "BO", "BP", "BQ", "BR", "BS", "BT", "BU", "BV",
                                                        "BW", "BX", "BY", "BZ" }; 



 public AvailabilityReader(string spreadsheet, List<ServiceType> sundayList)
        {
            // Set up a connection to the spreadsheet.
            this.spreadsheet = spreadsheet;
            Connection = new OleDbConnection(string.Format((Spreadsheet.EndsWith(".xlsx") ?
                    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;" :
                    "Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;"), Spreadsheet));

            // Set up an adapter for the spreadsheet.
            ColumnNames = new List<string>();
            var columnString = "[E-mail Address] AS Email";
            for (int i = 1; i <= sundayList.Count; i++)
            {
                columnString += string.Format(", Column{0}", i);
                ColumnNames.Add(string.Format("Column{0}", i));
            }

            var selectCommand = new OleDbCommand(string.Format("SELECT {0} FROM [DATA$O5:{1}300]", columnString, COLUMN_LABELS[sundayList.Count - 1]), Connection);
            Adapter = new OleDbDataAdapter(selectCommand);
            CommandBuilder = new OleDbCommandBuilder(Adapter);
            CommandBuilder.QuotePrefix = "[";
            CommandBuilder.QuoteSuffix = "]";

            // Obtain the table.
            var data = new DataSet();
            Adapter.Fill(data, "DATA");
            table = data.Tables["DATA"];
        }
//列字母数组,用于构造select查询。
私有只读字符串[]列标签=新字符串[]{“AS”、“AT”、“AU”、“AV”、“AW”、“AX”、“AY”、“AZ”、“BA”、“BB”,
“BC”、“BD”、“BE”、“BF”、“BG”、“BH”、“BI”、“BJ”、“BK”、“BL”,
“BM”、“BN”、“BO”、“BP”、“BQ”、“BR”、“BS”、“BT”、“BU”、“BV”,
“BW”、“BX”、“BY”、“BZ”};
公共可用性Reader(字符串电子表格、列表星期日列表)
{
//设置与电子表格的连接。
this.spreadsheet=电子表格;
连接=新的OleDbConnection(string.Format((Spreadsheet.EndsWith(“.xlsx”)?
“提供程序=Microsoft.ACE.OLEDB.12.0;数据源={0};扩展属性=Excel 12.0;”:
“Provider=Microsoft.Jet.OLEDB.4.0;数据源={0};扩展属性=Excel8.0;”,电子表格);
//为电子表格设置适配器。
ColumnNames=新列表();
var columnString=“[E-mail Address]作为电子邮件”;

对于(int i=1;i这通常发生在列名不正确时。确保它们与从中获取数据的表一致。

这通常发生在列名不正确时。确保它们与从中获取数据的表一致。

在所有
字符串之后的sql是什么。Format
>etc?如果
sundayList
有四个元素,则生成的查询将是
从[数据$O5:AV300]中选择[电子邮件地址]作为电子邮件,第1列、第2列、第3列、第4列
当直接在查询工具中执行而不是通过代码执行时,这是否有效?想法不错,但我不确定如何做到这一点-我的数据源是Excel电子表格,而不是“适当”的数据库。你能建议我尝试一下吗?毕竟
string.Format
等的sql是什么?如果
sundayList
有四个el因此,生成的查询将是从[DATA$O5:AV300]中选择[E-mail Address]作为电子邮件,第1列、第2列、第3列、第4列
直接在查询工具中执行而不是通过您的代码执行时,这是否有效?想法不错,但我不知道如何做到这一点-我的数据源是Excel电子表格,而不是“适当的”数据库。您能建议我尝试一下吗?就是这样!谢谢:)就是这样!谢谢:)