执行 ms-access 查询时出错

Posted

技术标签:

【中文标题】执行 ms-access 查询时出错【英文标题】:error while executing a ms-access query 【发布时间】:2013-06-06 06:05:40 【问题描述】:

我创建了一个查询以在 c# 中一次插入两个 ms 访问表。我遇到了异常

System.Data.OleDb.OleDbException:在 SQL 结束后找到的字符 陈述。在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult 小时)在 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams,对象和执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象& 执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,对象和执行结果)在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法)在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery() 在 CompanyDetails.Model.CompanyDetailsModel.setCompanyDetailsToDB(CompanyDetailsDataList _cmpDetailsList) 在 E:\Project\PBAttendence\ModifyPrivilage\CompanyDetails\Model\CompanyDetailsModel.cs:line 62

我的示例代码如下,请解决我的问题。对不起我的英语不好。

int companyID = _cmpDetailsList[0].CompanyID;
                    string companyName = _cmpDetailsList[0].CompanyName;
                    string contactID = _cmpDetailsList[0].ContactID;
                    string companyAddress = _cmpDetailsList[0].CompanyAddress;

                    if (companyID == -1)
                    
                        OleDbCommand cmd = new OleDbCommand("Insert into CompanyDetails([CompanyName],[CompanyAddress],[ContactID]) values ('" + companyName + "','" + companyAddress + "','" + contactID + "');Insert into UserCompanyDetails([UserID],[CompanyID]) values (" + "Select [UserID] from UserDetails;" + "," + "Select @@identity;" + "); ", conn);
                        conn.Open();
                        cmd.ExecuteNonQuery();
                        conn.Close();
                    
                    else
                    
                        OleDbCommand upcmd = new OleDbCommand("update CompanyDetails set [CompanyName] = '" + companyName + "',[CompanyAddress] = '" + companyAddress + "',[ContactID] = '" + contactID + "' where [CompanyID] = @cmpID;", conn);
                        conn.Open();
                        upcmd.Parameters.AddWithValue("@cmpID", companyID);
                        upcmd.ExecuteNonQuery();
                        conn.Close();
                    

现在我拆分为两个插入命令,但出现错误 System.Data.OleDb.OleDbException: 语法错误。在查询表达式 'Select [UserID] from UserDetails;

OleDbCommand cmd = new OleDbCommand("Insert into CompanyDetails([CompanyName],[CompanyAddress],[ContactID]) values ('" + companyName + "','" + companyAddress + "','" + contactID + "');", conn);
                        conn.Open();
                        cmd.ExecuteNonQuery();
                        conn.Close();
                        OleDbCommand cmd1 = new OleDbCommand("Insert into UserCompanyDetails([UserID],[CompanyID]) values (" + "Select [UserID] from UserDetails;" + "," + "Select @@identity" + ");", conn);
                        conn.Open();
                        cmd1.ExecuteNonQuery();
                        conn.Close();

【问题讨论】:

您的问题中有 2 个查询,如果您指出哪一行抛出错误会很有帮助(提示:它是第 62 行;))。 @Kristof 插入查询抛出错误。 我认为从 UserDetails 中选择 [UserID];在您的 Insert 语句中是问题所在。您要为多个用户插入它吗? "); "分号后面的这个空格可能是问题所在。 @VishalVaishya 是的,我绝对想插入多个用户 【参考方案1】:

问题出在这行代码:

OleDbCommand cmd = new OleDbCommand("Insert into CompanyDetails([CompanyName],[CompanyAddress],[ContactID]) values ('" + companyName + "','" + companyAddress + "','" + contactID + "');Insert into UserCompanyDetails([UserID],[CompanyID]) values (" + "Select [UserID] from UserDetails;" + "," + "Select @@identity;" + "); ", conn);

您在同一个OleDbCommand 中有两个insert 语句。尝试将其分为两个不同的步骤:

    插入到 CompanyDetails 表中 插入到 UserCompanyDetails 表中

希望对你有帮助

【讨论】:

一次可以执行两个查询 @Siva 是的,这是可能的,但您必须创建一个存储过程来为您执行此操作。您不能将两个单独的查询添加到同一个 OleDbCommand 中,这将生成您发布的错误。 Here 是一篇关于如何在 Access 中创建存储过程的好帖子。您可以采用任何一种方式,我认为将您的代码分成两个单独的 OleDbCommands 更容易,因为我假设您没有使用存储过程【参考方案2】:

首先,使用原始 sql 命令会更容易,然后使用生成 sql 的代码。 您可能会考虑创建一个存储过程,因为您的命令变得有点复杂 如果我是正确的,那么您目前正在尝试做的是:

Insert into table1(x,y,z) values a,b,c;
Insert into table2(x,y) values select * from table3; , @@identity

第二个 sql 命令在语法和逻辑上都无效,您的 @@identity 不会是静态的,因为您在命令期间插入了新记录。 我的建议是这样做:

Insert into table1(x,y,z) values a,b,c;
declare @table1Id int = @@identity
Insert into table2(x,y) select colA, @table1Id from table3;

【讨论】:

【参考方案3】:

你不能拥有 ;在 Access 中的查询中。请参阅http://office.microsoft.com/en-us/access-help/HV080760224.aspx 您将不得不按照@juanreyesv 的建议分别进行两次插入

您将需要进行 3 次查询,

    使用您的 sql 进行插入:"Insert into CompanyDetails([CompanyName],[CompanyAddress],[ContactID]) values ('" + companyName + "','" + companyAddress + "','" + contactID + "') 获取@@identity 使用 Select @@identity 并将其存储在变量中,例如 idnt 使用2.中得到的标识值进行第三次插入: "Insert into UserCompanyDetails([UserID],[CompanyID]) Select UserID, " + idnt.ToString() + " from UserDetails"

参考http://msdn.microsoft.com/en-us/library/ks9f57t0%28VS.71%29.aspx

【讨论】:

我试试你的查询 OleDbCommand cmd = new OleDbCommand("Insert into CompanyDetails([CompanyName],[CompanyAddress],[ContactID]) values ('" + companyName + "','" + companyAddress + "','" + contactID + "'); 插入 UserCompanyDetails([UserID],[CompanyID]) Select X.UserID, Y.CompID from (Select UserID from UserDetails) X, (Select @@identity As CompID) Y ;", 连接);我仍然遇到同样的错误 请调试并发布生成的sql语句。你可以通过添加一个额外的变量来做到这一点:string strSql = "Insert into CompanyDetails([CompanyName],[CompanyAddress],[ContactID]) values ('" + companyName + "','" + companyAddress + "','" + contactID + "'); Insert into UserCompanyDetails([UserID],[CompanyID]) Select X.UserID, Y.CompID from (Select UserID from UserDetails) X, (Select @@identity As CompID) Y;"; OleDbCommand cmd = new OleDbCommand(strSQL); 下个断点,看看strSQL的值是什么,贴出来。 这是 strSQL 中的值 插入 CompanyDetails([CompanyName],[CompanyAddress],[ContactID]) 值 ('TCS','adfasf','ad'); Insert into UserCompanyDetails([UserID],[CompanyID]) Select X.UserID, Y.CompID from (Select UserID from UserDetails) X, (Select @@identity As CompID) Y; 我认为你不能在一个语句中进行两次插入。您必须按照@juanreyesv 的建议分别进行两次插入。

以上是关于执行 ms-access 查询时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VBA 代码中的 ms-access 中执行查询?

如何让 MS-Access 为我的查询选择不同/正确的执行计划

查询在 MS-Access 中运行良好,但不能通过 jet 4 在 .net 中执行

在 Ms-Access 中将表名作为查询参数传递

Ms-access 中的一个查询

运行时错误 3032,无法执行此操作 ms-access