【问题标题】:Update of AccessDatasource does nothing but has no errorAccessDatasource 的更新什么都不做,但没有错误
【发布时间】:2010-12-19 05:49:06
【问题描述】:

我的 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>

请帮助我理解为什么更新没有改变数据。

看来我要么需要为要更改的值编写带有硬编码参数的 UpdateCommand,要么为要执行的每个更新编写 DeleteCommand 和 InsertCommand。请帮我想办法避免这种混乱。

【问题讨论】:

  • 您能具体说明“什么都没有发生”是什么意思吗?你如何检查“什么都没有发生”?
  • 什么都没有发生 = 更新命令不会更改任何行。我通过使用 SelectCommand 重新加载数据来查看数据进行检查。
  • 硬编码要更改的值使 UpdateCommand 工作。也许 AccessDataSource UpdateCommand 不能接受要更改的值的参数? UpdateCommand="UPDATE [fbPracticeSlot] SET StartTime = #12/30/1899 3:45:00 PM#, EndTime = #12/30/1899 5:30:00 PM# WHERE ID IN (SELECT [PracticeSlotID] FROM [vw_fbScheduleFull ] WHERE (([LocationID] = ?) AND ([DayName] = ?) AND ([PracticeDate] >= ?) AND ([PracticeDate]
  • 这看起来很有希望,但没有奏效:cosnetics.co.uk/articles/AccessDataSource-is-thick
  • 这个问题的另一个答案是关于 OnUpdating 和 OnUpdated 事件的详细信息。怎么回事?

标签: c# sql ms-access


【解决方案1】:

通过阅读您的问题和所有后续内容,我可以看到您几乎涵盖了所有基础。我确实有一个想法,这真的是在黑暗中的一个镜头。可能 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 的列而感到困惑。

无论如何,您似乎已经尝试了其他所有方法。祝你好运!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这可能不是答案,我不经常使用这样的数据适配器,但我过去注意到传递给针对访问数据库的查询的参数顺序很重要。

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

      【讨论】:

      • 这是我寻找的第一件事。参数的顺序似乎正确。但是,您是对的,对于 OleDb,该顺序至关重要。
      【解决方案4】:

      尝试捕获Updating 事件,以查看运行AccessDataSource6.Update(); 时执行的SQL 是什么

      在事件中,您可以通过查看底层 SQL SQLDataSourceCommandEventArgsCommand 属性的实例。

      这应该是起点。
      如果 SQL 看起来正常,请尝试在您的 MDB 上运行它以查看是否引发任何错误。

      【讨论】:

      • Shahkalpesh,之前有另一个答案,其中包含用于显示参数的代码示例。由于某种原因,它消失了。作为对该答案的评论,我回答说所有参数都按预期通过。我的想法是 AccessDatasource 不支持在 UPDATE 命令中设置值的参数。在 Access GUI 中,在 UPDATE 命令中参数化要设置的列同样困难(也许没有 VBA 支持是不可能的)。
      • @Degan:按照我的建议,试着抓住这个事件。这将为您提供有关失败以及是否应该失败的线索?
      • @Shahkalpesh,此时,最早的尝试将是从现在起大约 4-5 天。
      【解决方案5】:

      我可能会因为这个无用的答案而被否决,但我不禁注意到您在 UPDATE 子句中使用符号 > 和 *sniff*

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

      【讨论】:

      • 刚刚又看了一遍,为什么UpdateCommand的SQL命令中的表名没有括号,而SelectCommand却有。我注意到缺少一些东西,没有提到您使用的是什么版本的 MS-Access 以及前端到底在做什么?通过 ADO.NET 的连接是否由于 IIS 下的连接池而过期?您使用的是哪个版本的 IIS?
      • 顺便说一句,您是否在服务器端显式打开和关闭连接,可能忘记处理连接而不是 using 子句。我在这里看这个...stackoverflow.com/questions/686970/…
      • 链接错误...应该是stackoverflow.com/questions/686970/…我的错!呸! :(
      • XML 常量由 IDE (Visual Web Developer 2008 Express) 写出。我在其他地方没有遇到过问题,但我会尝试切换它们。我没有明确地打开和关闭连接。 Access 2007。我正在使用 Visual Wb Developer 2008 Express 在本地进行测试。当我将参数更改为无效值时,出现错误。良好的价值观没有错误。我目前的猜测是 AccessDataSource 没有正确处理 UpdateCommand。
      • 将 XML 常量更改为符号没有任何影响。
      【解决方案6】:

      通常一个有效的 SQL 更新语句会失败而没有错误,因为没有记录符合您的 WHERE 条件。有没有在Button_Click事件上设置断点,查看参数值?

      【讨论】:

      • UPDATE参数的WHERE条件与DELETE参数的WHERE条件完全相同。不过,我也会试试这个。
      • 是的,我确实检查了参数。我的想法是 AccessDatasource 不支持在 UPDATE 命令中设置值的参数。在 Access GUI 中,在 UPDATE 命令中参数化要设置的列同样困难(可能没有 VBA 支持)
      • 我唯一能想到的另一件事是,如果您在 EditTemplate 中使用 Bind()。如果您愿意,请尝试将其更改为 Eval()。
      • AccessDatasource 可能不支持 SET 语句中的参数化值,但 Jet/ACE SQL 肯定支持。
      猜你喜欢
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多