【问题标题】:Stored Procedure not updating Null field存储过程不更新 Null 字段
【发布时间】:2015-09-25 01:11:08
【问题描述】:

我设置了一个文本字段和按钮来修剪 youtube 链接的末尾并将其保存到 SQL Server 表中。但我的存储过程实际上并没有保存任何东西。

HTML

<asp:TextBox ID="txtYoutubeLink" runat="server" AutoPostBack="true" Width="300"></asp:TextBox>
<asp:Button ID="btnSave" runat="server" Text="Save Link" Width="120" />

VB.Net

 Protected Sub btnSave_Click(sender As Object, e As System.EventArgs) Handles btnSave.Click
        If txtYoutubeLink.Text = "" Then
        Else

            Dim link As String = txtYoutubeLink.Text
            Dim shortlink As String = link.Substring(link.LastIndexOf("=") + 1)

            SqlHelper.ExecuteNonQuery(System.Configuration.ConfigurationManager.AppSettings("dbConn"), "X_WW_spSaveVideoUrl", lstStockItems.SelectedItem.Value.ToString(), shortlink)
        End If
    End Sub

存储过程

ALTER PROCEDURE [dbo].[X_WW_spSaveVideoUrl]
     @STOCKCODE VARCHAR(15),
     @VideoURL VARCHAR(max)
AS
    UPDATE Stock_Items 
    SET X_VIDEOURL = @VideoURL
    WHERE StockCode = @STOCKCODE

lstStockItems 是由另一个存储过程设置的 ASP:Datalist,值字段已正确设置为产品库存代码。它在几页上都在使用,所以我知道这不是它失败的地方,但我不明白为什么新程序不起作用。我唯一能想到的是这被用来覆盖现有表中的null 字段,所以也许我的更新查询是错误的?

编辑

这是另一个文本框/按钮组合,我用它来更改已经列出针对它们的产品的 youtube 链接。

Protected Sub btnUpdate_Click(sender As Object, e As System.EventArgs) Handles btnUpdate.Click
        If txtChangeYoutubeLink.Text = "" Then
        Else
            Dim link As String = txtChangeYoutubeLink.Text
            Dim shortlink As String = link.Substring(link.LastIndexOf("=") + 1)
            SqlHelper.ExecuteNonQuery(System.Configuration.ConfigurationManager.AppSettings("dbConn"), "X_WW_spSaveVideoUrl", lstLinked.SelectedItem.Value.ToString(), shortlink)
        End If
    End Sub

工作正常。因此,我可以使用该过程将 X_VideoUrl 字段从“blah”更改为“bleh”,但不能将其从 NULL 更改为“bleh”。

【问题讨论】:

  • 你调试过你的代码吗?您是否尝试查看 shortlink 和 lstStockItems.SelectedItem.Value.ToString() 中存储的值以及您传递的值?可能是您以错误的顺序传递值。
  • Youtube 链接 youtube.com/watch?v=Q03nIupGAIQ 正确缩短为 Q03nIupGAIQ,但未发送到 SQL 表。我还仔细检查了它是否获得了正确的列表项值。
  • 显示此方法/签名.. SqlHelper.ExecuteNonQuery(System.Configuration.ConfigurationManager.AppSettings("dbConn"), "X_WW_spSaveVideoUrl", lstStockItems.SelectedItem.Value.ToString(), shortlink).我几乎可以这样,因为你传递的参数通常不是这样做的方法,除非你创建了这个方法......而且那些不是 sql 参数,我不知道你甚至会编译它。
  • @Codexer 在我得到这份工作之前,它已经存在于网站的 Webconfig 中。它用于对 SQL 服务器的任何调用。 tp ("dbConn") 上的所有内容仅访问正确的服务器,"X_WW_spSaveVideoUrl" 是存储过程的名称,然后是 SQL 中声明顺序的过程参数,它在整个站点中至少使用了 150 次,并且有人谁比我知道的更多,所以这不应该是问题。
  • 您必须将参数发送给 sql 实例,而不仅仅是字符串

标签: sql-server vb.net stored-procedures


【解决方案1】:

当您使用 SP 在数据库表中保存任何字符串时,您应该使用像 '"++"' 这样的单引号编写。你以这种方式传递你的变量值。

您可以进行这样的更改。 SqlHelper.ExecuteNonQuery(System.Configuration.ConfigurationManager.AppSettings("dbConn"), '"X_WW_spSaveVideoUrl"', lstLinked.SelectedItem.Value.ToString(), shortlink)

或者

Dim URL as string = "www.youtube.com"
SqlHelper.ExecuteNonQuery(System.Configuration.ConfigurationManager.AppSettings("dbConn"), '"+ URL +"', lstLinked.SelectedItem.Value.ToString(), shortlink)

【讨论】:

  • ("dbConn") 后面的字符串不是保存到表中的字符串。它是存储过程的名称,仅与双引号一起使用。这是本网站代码的标准部分,更多的是我想知道的 SQL 过程本身,因为它在一种情况下有效,但在另一种情况下无效?
  • 你想看代码的哪一部分?我已经发布了与这种情况有关的所有内容,页面的其余部分涉及布局和另外几个执行不同功能的按钮。 SQLHelper 行本身不是问题,因为它在整个站点中至少使用了 100 次。
【解决方案2】:

我找到了解决方法。在摇晃、催促、诅咒和对我的代码生气之后,我只是交叉手指并在服务器管理器中运行更新查询。更新了 35,000 个库存项目的列,将 NULL 更改为 0。

我所做的查询将字段从 0 更改为我想要的任何内容都没有问题,因此我不再处理空字段,只是确保列上的默认值为 0 以涵盖新的库存项目。

现在工作正常。

【讨论】:

  • 那是一篇有趣的文章,我一直觉得 NULL 麻烦多于它的价值。我仍然认为我可以从 0 更改为 1 但不能从 null 更改为 1 很奇怪。
猜你喜欢
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多