带或不带括号的 MS Access Sql 查询错误
MS Access Sql query errors with or without brackets
我通常使用 SQL Server Express 数据库在 C# 中工作,但需要使用 MS Access 数据库[=35 复制一些查询=] 在另一个应用程序中。
在我的一种方法中,我使用 INNER JOIN 来连接 2-tables。
当我 运行 我的原始查询时,如下所示的第一个查询,它抛出以下错误。
IErrorInfo.GetDescription 失败 E_FAIL(0x80004005)。
在调查此错误时,它建议我在列名称(甚至 table 名称)两边加上方括号。
但是,当代码到达我的 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 时顺序很重要,所以请将它们放在 sql 中,并按照相同的顺序添加参数。您的订单没问题(没有遗漏的订单)。
因此,似乎缺少一个参数。我们将假设观众和花生画廊对可怕的 miss-leading 错误消息的评论不在这里说出来!
我通常使用 SQL Server Express 数据库在 C# 中工作,但需要使用 MS Access 数据库[=35 复制一些查询=] 在另一个应用程序中。
在我的一种方法中,我使用 INNER JOIN 来连接 2-tables。 当我 运行 我的原始查询时,如下所示的第一个查询,它抛出以下错误。
IErrorInfo.GetDescription 失败 E_FAIL(0x80004005)。
在调查此错误时,它建议我在列名称(甚至 table 名称)两边加上方括号。
但是,当代码到达我的 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 时顺序很重要,所以请将它们放在 sql 中,并按照相同的顺序添加参数。您的订单没问题(没有遗漏的订单)。
因此,似乎缺少一个参数。我们将假设观众和花生画廊对可怕的 miss-leading 错误消息的评论不在这里说出来!