2011-07-29 86 views
0

是啊,這是一個非常簡單的話題,但我的表單只是沒有在數據庫中更新該行:編輯SQL數據

這裏是我的代碼:

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屬性不包含我在測試時所做的更改。

+0

對我來說看起來合適。您是否測試過SSMS查詢分析器的程序? – Yuck

+0

到目前爲止,我無法識別SQL的問題。我的第一本能是設置一個斷點並驗證Request.QueryString(「i」)和CategoryText是否獲取了與數據庫中某些內容相對應的值,如果尚未這樣做的話。 –

+0

你是說MyTextbox.Text沒有顯示用戶輸入的更新文本? –

回答

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 
0

有時我發現重構代碼以消除重複可以真正有助於調試(和長期維護)。這裏是你的代碼與重複邏輯集中了一下。我的猜測是,您的問題是您要將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 Sub