首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编辑SQL数据

编辑SQL数据
EN

Stack Overflow用户
提问于 2011-07-30 02:03:13
回答 2查看 219关注 0票数 0

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

下面是我的代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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上,以检查它在智能感知中的Text属性的值。请记住,调试器仍位于过程的第一行。调试器此时显示的txtContent.Text属性不包含我在测试时所做的任何更改。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-10 22:18:46

虽然花了3个月的时间,但我还是找到了答案。

调试器看不到我的文本字段的任何更改的原因是...等等..。

这些字段是在页面加载时从数据库填充的。

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2011-07-30 10:37:14

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

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

就存储过程而言,我看不出它有什么问题。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6877135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档