【问题标题】:Windows Azure stored procedure not executingWindows Azure 存储过程未执行
【发布时间】:2013-09-23 03:43:39
【问题描述】:

我的问题如下:我有一个使用少量存储过程的站点,并且所有这些在我的本地开发环境中都可以正常工作。

但是,其中一个存储过程要么没有被触发,要么一旦发布到 Windows Azure 就失败了。

我与数据库的连接良好,因为站点的其他部分正常运行,我使用 fiddler 检查 post 事件是否通过了正确的数据 - 确实如此。

我已经进入 Azure 数据库并查看了存储过程,一切看起来都不错,我什至使用 Azure 工具对其进行了测试 - 我可以传入数据并且它可以毫无问题地执行。

所以我很困惑我还能做些什么来找出这个问题的原因。

我做的最后一件事是仔细检查我的本地副本,然后将其重新发布到 Azure。

存储过程:

BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;

 -- Insert statements for procedure here
 INSERT INTO [dbo].[Events] ([Type] ,[StartDate]) VALUES (@Type, @StartDate)
END

【问题讨论】:

    标签: c# sql sql-server stored-procedures azure


    【解决方案1】:

    您如何确定您的存储过程没有运行?有三种可能的结果:您的代码没有调用 proc,proc 运行但抛出了您未捕获的错误,或者 proc 成功运行。

    在运行代码后尝试运行以下语句以验证 proc 是否未运行。它取自MSDN。它不会显示对 proc 的调用,但会显示其中调用的语句。确保在测试之前和之后运行此语句。如果你没有看到你的 proc 正在运行的语句,它可能没有被调用。如果您的 INSERT 语句失败(在这种情况下,它可能不会显示在下面),我会在您的 proc 顶部添加一个 SELECT 0 作为在下面的输出中查找的标记。

    SELECT query_stats.query_hash AS "Query Hash", 
        SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",
        MIN(query_stats.statement_text) AS "Statement Text"
    FROM 
        (SELECT QS.*, 
        SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
        ((CASE statement_end_offset 
            WHEN -1 THEN DATALENGTH(ST.text)
            ELSE QS.statement_end_offset END 
                - QS.statement_start_offset)/2) + 1) AS statement_text
         FROM sys.dm_exec_query_stats AS QS
         CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
    GROUP BY query_stats.query_hash
    ORDER BY 2 DESC;
    

    【讨论】:

    • 谢谢,我用上面的方法发现了天蓝色的查询性能——从这一切看来,存储过程没有被触发。我仍然不知道为什么 - 它确实在本地工作
    • 那你需要看看你的代码。您是否连接到正确的数据库?如果您不指定数据库名称,您的代码将连接到 master。您是否捕获了所有异常?您是否在某处记录您的异常以供审核?
    • 我正在连接到正确的数据库,因为其他存储过程使用我创建的相同数据库连接服务并且这些工作正常。我正在使用 Log4Net 来捕获执行此服务的任何错误,并且没有任何内容被吐出(将进一步研究)。
    【解决方案2】:

    已找到此问题的原因 - 仍在寻找解决方法。

    问题不在于存储过程,因为由于输入、站点和最终数据库之间的文化不匹配而没有调用它。

    在我的所有测试中,我以英国日期格式(使用日期 dd/mm/yyyy 的正确方法)传递,这意味着我的模型是有效的,但是当部署到天蓝色(在欧盟服务器上)时,日期格式它期望是美国(不是使用日期 mm/dd/yyyy 的正确方法!)

    所以下面的代码正在完成它的工作并将我重定向回当前页面。

    if (ModelState.IsValid)
      {
        database.SaveNewEvent(model);
      }
    return Redirect.....
    

    在我注释掉这行代码后,我得到了真正的错误,现在可以考虑改变我的网站和数据库的文化以使用真正的日期格式。

    SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
    

    感谢大家如何帮助我解决这个问题:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      相关资源
      最近更新 更多