AccessDatasource的更新什么都不做,但没有错误

时间:2009-11-22 15:46:58

标签: c# sql ms-access

我的UPDATE命令无法更改表中的任何日期,而非常相似的SELECT和DELETE命令有效。当我将UpdateParameters更改为无效选项时,后面的代码命令会抛出错误,但是当参数正确时,没有任何内容。

激活DELETE(可行)的代码

protected void Button2_Click(object sender, EventArgs e)
{
    this.AccessDataSource6.Delete();
}

隐藏代码以激活UPDATE(这似乎对数据有任何影响)

protected void Button1_Click(object sender, EventArgs e)
{
    this.AccessDataSource6.Update();
} 

AccessDatasource,其SQL命令和参数

   <asp:AccessDataSource ID="AccessDataSource6" runat="server" DataFile="~/App_Data/ASPNetDB.mdb" 
    SelectCommand="SELECT [PracticeDate], 
                          [StartTime], 
                          [EndTime], 
                          [Division], 
                          [TeamStr], 
                          [FieldName] 
    FROM [vw_fbScheduleFull]
    WHERE (([LocationID] = ?) 
       AND ([DayName] = ?) 
       AND ([PracticeDate] &gt;= ?) 
       AND ([PracticeDate] &lt;= ?) 
       AND ([StartTime] = ?))
    ORDER BY [PracticeDate], [FieldName]"

    UpdateCommand="UPDATE fbPracticeSlot 
    SET StartTime = ?, EndTime = ?
    WHERE ID IN (
       SELECT [PracticeSlotID] 
       FROM [vw_fbScheduleFull] 
       WHERE (([LocationID] = ?) 
          AND ([DayName] = ?) 
          AND ([PracticeDate] &gt;= ?) 
          AND ([PracticeDate] &lt;= ?) 
          AND ([StartTime] = ?))
       )" 

   DeleteCommand="DELETE FROM fbPracticeSlot 
    WHERE ID IN (
       SELECT [PracticeSlotID] 
       FROM [vw_fbScheduleFull]
       WHERE (([LocationID] = ?) 
          AND ([DayName] = ?) 
          AND ([PracticeDate] &gt;= ?) 
          AND ([PracticeDate] &lt;= ?) 
          AND ([StartTime] = ?)) 
       )">

<SelectParameters>
       <asp:ControlParameter ControlID="DropDownListLocation" Name="LocationID" PropertyName="SelectedValue" Type="Int32" />
       <asp:ControlParameter ControlID="DropDownListDOW" Name="DayName" PropertyName="SelectedValue" Type="String" />
       <asp:ControlParameter ControlID="DropDownListStartDate" Name="PracticeDate" PropertyName="SelectedValue" Type="DateTime" />
       <asp:ControlParameter ControlID="DropDownListEndDate" Name="PracticeDate2" PropertyName="SelectedValue" Type="DateTime" />
       <asp:ControlParameter ControlID="DropDownListStartTime" Name="StartTime" PropertyName="SelectedValue" Type="DateTime" />
</SelectParameters>

<UpdateParameters>
       <asp:ControlParameter ControlID="DropDownListNewStart" Name="NewStartTime" PropertyName="SelectedValue" Type="DateTime" />                  
       <asp:ControlParameter ControlID="DropDownListNewEnd" Name="NewEndTime" PropertyName="SelectedValue" Type="DateTime" />
       <asp:ControlParameter ControlID="DropDownListLocation" Name="LocationID" PropertyName="SelectedValue" Type="Int32" />
       <asp:ControlParameter ControlID="DropDownListDOW" Name="DayName" PropertyName="SelectedValue" Type="String" />
       <asp:ControlParameter ControlID="DropDownListStartDate" Name="PracticeDate" PropertyName="SelectedValue" Type="DateTime" />
       <asp:ControlParameter ControlID="DropDownListEndDate" Name="PracticeDate2" PropertyName="SelectedValue" Type="DateTime" />
       <asp:ControlParameter ControlID="DropDownListStartTime" Name="StartTime" PropertyName="SelectedValue" Type="DateTime" />
</UpdateParameters>

<DeleteParameters>
       <asp:ControlParameter ControlID="DropDownListLocation" Name="LocationID" PropertyName="SelectedValue" Type="Int32" />
       <asp:ControlParameter ControlID="DropDownListDOW" Name="DayName" PropertyName="SelectedValue" Type="String" />
       <asp:ControlParameter ControlID="DropDownListStartDate" Name="PracticeDate" PropertyName="SelectedValue" Type="DateTime" />
       <asp:ControlParameter ControlID="DropDownListEndDate" Name="PracticeDate2" PropertyName="SelectedValue" Type="DateTime" />
       <asp:ControlParameter ControlID="DropDownListStartTime" Name="StartTime" PropertyName="SelectedValue" Type="DateTime" />
</DeleteParameters>

</asp:AccessDataSource>

请帮助我理解为什么更新不会更改数据。

似乎我需要使用硬编码参数编写UpdateCommands以更改值,或者为我要执行的每个更新编写DeleteCommand和InsertCommand。请帮助我找到一些方法来避免这种污染。

6 个答案:

答案 0 :(得分:1)

通常,有效的SQL Update语句会在没有错误的情况下失败,因为没有记录符合您的WHERE条件。您是否在Button_Click事件上设置了断点并查看了参数的值?

答案 1 :(得分:0)

尝试并捕获Updating事件,以查看运行AccessDataSource6.Update();

时执行的SQL是什么

在事件中,您可以通过查看来获取基础SQL SQLDataSourceCommandEventArgsCommand属性的实例。

这应该是起点 如果SQL看起来没问题,请尝试在MDB上运行它,看看它是否会引发任何错误。

答案 2 :(得分:0)

这可能不是答案,我不像这样使用数据adpaters,但我在过去已经注意到,传递给查询的参数的顺序对于访问数据库很重要。

您的更新参数列表与更新查询中的参数顺序不匹配 - 这可能只是您的问题(假设您已完成上述操作并检查是否存在与您的where子句匹配的内容)。

答案 3 :(得分:0)

首先,在更新数据库之后,你会怎么做?我遇到了一个问题,访问数据库在你的项目中,你自动设置为始终复制到输出目录。如果您运行代码然后重新启动它,访问数据库就会被吹走。只是一个想法,但一个是确保你没有做。

答案 4 :(得分:0)

通过阅读你的问题和所有后续行动,我可以看到你已经涵盖了所有的基础。我确实有一个想法,它真的是在黑暗中拍摄。也许Access解析器无法将目标列识别为属于您正在更新的表。你试过了吗?

    UpdateCommand="UPDATE fbPracticeSlot 
    SET fbPracticeSlot.StartTime = ?, fbPracticeSlot.EndTime = ?
    WHERE ID IN (
    SELECT [PracticeSlotID] 
    FROM [vw_fbScheduleFull] 
    WHERE (([LocationID] = ?) 
      AND ([DayName] = ?) 
      AND ([PracticeDate] &gt;= ?) 
      AND ([PracticeDate] &lt;= ?) 
      AND ([StartTime] = ?))
   )"

由于Access支持多表更新,因此在嵌套选择内部存在名为StartTime的列时,解析器可能会混淆。

无论如何,似乎你已经尝试了其他一切。祝你好运!

答案 5 :(得分:-1)

我可能会因为这个无用的答案而被投票,但我不禁注意到你正在使用符号的xml常量&gt;和&lt;在您的UPDATE子句中....在UpdateCommand上写一个响应来验证sql是否有效,复制该SQL并将其粘贴到Access中,看看它是否被Access本身接受?对不起,如果这听起来蹩脚而愚蠢*sniff*

希望这有帮助, 最好的祝福, 汤姆。