编辑SQL数据

时间:2011-07-29 18:03:13

标签: sql vb.net

是的,这是一个非常简单的主题,但我的表单只是没有更新数据库中的行:

这是我的代码:

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSubmit.Click
    If Request.QueryString("a") = "edit" Then
        Dim CategoryText As String = lstCategory.SelectedItem.Text

        Dim conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=LogansArchive; Integrated Security=True;")
        Dim cmd As New SqlCommand("UpdateArticle", conn)

        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@ArticleID", Request.QueryString("i"))
        cmd.Parameters.AddWithValue("@Category", CategoryText)
        cmd.Parameters.AddWithValue("@ArticleTitle", txtNewTitle.Text)
        cmd.Parameters.AddWithValue("@ArticleContent", txtContent.Text)

        conn.Open()
        cmd.ExecuteNonQuery()
        conn.Close()
    Else
        Dim CategoryText As String = lstCategory.SelectedItem.Text
        Dim conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=LogansArchive; Integrated Security=True;")
        Dim cmd As New SqlCommand("AddArticle", conn)

        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@Category", CategoryText)
        cmd.Parameters.AddWithValue("@Date", Now)
        cmd.Parameters.AddWithValue("@ArticleTitle", txtNewTitle.Text)
        cmd.Parameters.AddWithValue("@ArticleContent", txtContent.Text)

        conn.Open()
        cmd.ExecuteNonQuery()
        conn.Close()
    End If
End Sub

以下是代码引用的SP:

ALTER PROCEDURE [dbo].[UpdateArticle]
    -- Add the parameters for the stored procedure here
    @ArticleID int,
    @Category varchar(20),
    @ArticleTitle varchar(100),
    @ArticleContent text
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    UPDATE Articles
    SET
        Articles.Category = (SELECT CategoryID FROM Categories WHERE CategoryName = @Category),
        Articles.ArticleTitle = @ArticleTitle,
        Articles.ArticleContent = @ArticleContent
    WHERE Articles.ArticleID = @ArticleID
END

我以前从未在SQL中使用过嵌套的SELECT,所以我不确定我是否做得对。 除此之外,这是我之前所做的所有事情,所以我相对肯定这一切都是正确的。

最后,我调试时没有报告错误,尽管更新似乎没有来自文本字段(txtContent.Text没有更改以反映新值)。

提前感谢您的协助。

编辑1: 感谢您的更新,我查看了CInt(Request.Querystring("i"))问题,并没有解决问题。我在程序开始时设置了一个断点,并在txtContent.Text上方盘旋,以检查它在intellisense中的Text属性的值。请记住,调试器仍然在过程的第一行。此时调试器显示的txtContent.Text属性不包含我在测试时所做的任何更改。

2 个答案:

答案 0 :(得分:0)

有时我发现删除重复的重构代码对调试(和长期维护)非常有帮助。这是您的代码,重复的逻辑集中了一点。我的猜测是,您的问题是您将String而不是Integer传递给您的SP ArticleID。你会看到我做了一个CInt(Request.QueryString("i"))来确保你得到一个整数来代替Request.QueryString("i")返回的字符串。

您可能还想查看我的TODO评论并在那里放置断点并使用调试器确保您期望的所有内容进入cmd.Parameters集合。

就存储过程而言,我认为没有任何问题。

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSubmit.Click
    Dim categoryText As String = lstCategory.SelectedItem.Text
    Dim articleTitle = txtNewTitle.Text
    Dim articleContent = txtContent.Text

    Dim conn As New SqlConnection("Data Source=.\SQLEXPRESS; Initial Catalog=LogansArchive; Integrated Security=True;") 

    Dim cmd as SqlCommand

    If (Request.QueryString("a") = "edit") Then
        Dim articleId = CInt(Request.QueryString("i")) ' Convert provided Article ID to Int

        cmd = New SqlCommand("UpdateArticle", conn)    
        cmd.CommandType = CommandType.StoredProcedure

        cmd.Parameters.AddWithValue("@ArticleID", articleId)
    Else
        cmd = New SqlCommand("AddArticle", conn)
        cmd.CommandType = CommandType.StoredProcedure

        cmd.Parameters.AddWithValue("@Date", Now)    
    End If

    cmd.Parameters.AddWithValue("@Category", categoryText)
    cmd.Parameters.AddWithValue("@ArticleTitle", articleTitle)
    cmd.Parameters.AddWithValue("@ArticleContent", articleContent)

    ' TODO: Put a breakpoint here and inspect cmd.Parameters to be sure they all contain what you expect them to contain.

    conn.Open()
    cmd.ExecuteNonQuery()
    conn.Close()
End Sub

答案 1 :(得分:0)

好吧花了3个月,但我找到了答案。

调试器没有看到对我的文本字段的任何更改的原因是......等待它......

在页面加载时从数据库中填充字段。

我在工作中遇到了同样的问题,其中一位开发人员用这个打了我。要解决此问题,请将填充表单的代码放入以下IF语句中:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        ' Populate the form out of the database here
    End If
End Sub