是的,这是一个非常简单的主题,但是我的表单并没有更新数据库中的行:
下面是我的代码:
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上,以检查它在智能感知中的Text属性的值。请记住,调试器仍位于过程的第一行。调试器此时显示的txtContent.Text属性不包含我在测试时所做的任何更改。
发布于 2011-10-10 22:18:46
虽然花了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发布于 2011-07-30 10:37:14
有时,我发现重构代码以消除重复对调试(和长期维护)非常有帮助。这是您的代码,其中的重复逻辑稍微集中了一些。我的猜测是,您的问题是将String而不是Integer传递给ArticleID的SP。您将看到,我做了一个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 Subhttps://stackoverflow.com/questions/6877135
复制相似问题