执行 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 查询时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何让 MS-Access 为我的查询选择不同/正确的执行计划