是的,这是一个非常简单的主题,但我的表单只是没有更新数据库中的行:
这是我的代码:
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
属性不包含我在测试时所做的任何更改。
答案 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