2010-03-07 85 views
0

我已经使用Visual Studio 2008 ASP.NET AccessDataSource向导来生成更新命令。 GridView编辑按钮的作品。但是,当我点击Gridview中的更新链接时,我收到以下消息:System.Data.OleDb.OleDbException:没有给出一个或多个所需参数的值

System.Data.OleDb.OleDbException: No value given for one or more required parameters 

向导是否有错误?

这是它生成的源代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Untitled Page</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

    </div> 
    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
     AllowSorting="True" AutoGenerateColumns="False" AutoGenerateDeleteButton="True" 
     AutoGenerateEditButton="True" AutoGenerateSelectButton="True" DataKeyNames="Id" 
     DataSourceID="AccessDataSource1" PageSize="1"> 
     <Columns> 
      <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" 
       ReadOnly="True" SortExpression="Id" /> 
      <asp:BoundField DataField="TaskName" HeaderText="TaskName" 
       SortExpression="TaskName" /> 
      <asp:BoundField DataField="TaskDescription" HeaderText="TaskDescription" 
       SortExpression="TaskDescription" /> 
      <asp:BoundField DataField="TaskPriority" HeaderText="TaskPriority" 
       SortExpression="TaskPriority" /> 
     </Columns> 
    </asp:GridView> 
    <asp:AccessDataSource ID="AccessDataSource1" runat="server" 
     ConflictDetection="CompareAllValues" DataFile="~/App_Data/tasks.mdb" 
     DeleteCommand="DELETE FROM [Tasks] WHERE [Id] = ? AND (([TaskName] = ?) OR ([TaskName] IS NULL AND ? IS NULL)) AND (([TaskDescription] = ?) OR ([TaskDescription] IS NULL AND ? IS NULL)) AND (([TaskPriority] = ?) OR ([TaskPriority] IS NULL AND ? IS NULL))" 
     InsertCommand="INSERT INTO [Tasks] ([Id], [TaskName], [TaskDescription], [TaskPriority]) VALUES (?, ?, ?, ?)" 
     OldValuesParameterFormatString="original_{0}" 
     SelectCommand="SELECT * FROM [Tasks]" 
     UpdateCommand="UPDATE [Tasks] SET [TaskName] = ?, [TaskDescription] = ?, [TaskPriority] = ? WHERE [Id] = ? AND (([TaskName] = ?) OR ([TaskName] IS NULL AND ? IS NULL)) AND (([TaskDescription] = ?) OR ([TaskDescription] IS NULL AND ? IS NULL)) AND (([TaskPriority] = ?) OR ([TaskPriority] IS NULL AND ? IS NULL))"> 
     <DeleteParameters> 
      <asp:Parameter Name="original_Id" Type="Int32" /> 
      <asp:Parameter Name="original_TaskName" Type="String" /> 
      <asp:Parameter Name="original_TaskDescription" Type="String" /> 
      <asp:Parameter Name="original_TaskPriority" Type="Single" /> 
     </DeleteParameters> 
     <UpdateParameters> 
      <asp:Parameter Name="TaskName" Type="String" /> 
      <asp:Parameter Name="TaskDescription" Type="String" /> 
      <asp:Parameter Name="TaskPriority" Type="Single" /> 
      <asp:Parameter Name="original_Id" Type="Int32" /> 
      <asp:Parameter Name="original_TaskName" Type="String" /> 
      <asp:Parameter Name="original_TaskDescription" Type="String" /> 
      <asp:Parameter Name="original_TaskPriority" Type="Single" /> 
     </UpdateParameters> 
     <InsertParameters> 
      <asp:Parameter Name="Id" Type="Int32" /> 
      <asp:Parameter Name="TaskName" Type="String" /> 
      <asp:Parameter Name="TaskDescription" Type="String" /> 
      <asp:Parameter Name="TaskPriority" Type="Single" /> 
     </InsertParameters> 
    </asp:AccessDataSource>  
    </form> 
</body> 
</html> 

回答

1

更改UpdateParamters部分是这样的:

<UpdateParameters> 
     <asp:Parameter Name="TaskName" Type="String" /> 
     <asp:Parameter Name="TaskDescription" Type="String" /> 
     <asp:Parameter Name="TaskPriority" Type="Single" /> 
     <asp:Parameter Name="original_Id" Type="Int32" /> 
    </UpdateParameters> 

而且你UpdateCommand这个(只是删除换行符):

UPDATE [Tasks] 
SET [TaskName] = ?, [TaskDescription] = ?, [TaskPriority] = ? 
WHERE [Id] = ? 

这里假设你的ID列是主键,我不知道为什么向导像创建它一样,但不需要比较其他列。

+0

它似乎产生这一点,因为我检查了选项“使用乐观并发”。如果我没有选中它会产生你说的话,否则它会起作用。 – user310291 2010-03-07 14:19:13

1

在我的经验,该错误消息通常信号类型不正确的列名。

我建议你对代码进行逐步调试,并尝试检查一次执行参数替换时每个命令生成的SQL。

+0

感谢嗨,我终于找到了原因,虽然这很烦人,它不能管理乐观并发。 – user310291 2010-03-07 14:19:48

1

也可能是因为列名错误。 例子:

cmd.CommandText = "" 
    + "UPDATE Marriage " 
    + " SET labelprint = ? " 
    + " WHERE model = ? AND plant = ? AND seq = ? " 
    + ""; 

将始终报告“System.Data.OleDb.OleDbException:没有为一个或多个必需的参数给定值”,因为错误的列名错误。但正如发现正确的列名是“LabelPrinted”(但不是“LabelPrint”)!

因此,它看起来像MS Access可能会解释错误的列名作为参数,如结果 - 报告的错误......

相关问题