【问题标题】:database update sql not affecting database数据库更新sql不影响数据库
【发布时间】:2012-04-28 07:59:58
【问题描述】:

我有这段代码来更新数据库,但是当我使用正确的数据运行它时,它执行时没有错误,但数据库没有更新

 Dim conn As New SqlClient.SqlConnection(My.Resources.conn_str)
 Dim SQL As String = "Update vehicle SET make=@make,reg_no=@reg_no,model=@model,year=@year,type=@type,last_service=@last_service Where (id = @id)"
        conn.Open()
        Try
            Dim cmd As New SqlClient.SqlCommand(SQL, conn)
            Try
                cmd.Parameters.AddWithValue("@make", strMake)
                cmd.Parameters.AddWithValue("@reg_no", strRegnNum)
                cmd.Parameters.AddWithValue("@model", strModel)
                cmd.Parameters.AddWithValue("@year", intYear)
                cmd.Parameters.AddWithValue("@type", strType)
                cmd.Parameters.AddWithValue("@last_service", LastService)
                cmd.Parameters.AddWithValue("@id", ID.ToString)
                cmd.ExecuteNonQuery()
                cmd.Dispose()
            Catch ex As Exception
                Return ex.Message
            End Try
        Catch ex As Exception
            Return ex.Message
        Finally
            conn.Dispose()
        End Try

由于我没有收到错误消息,任何人都可以帮助我解决其无法正常工作的原因吗?

谢谢

编辑 我用

替换了 cmd.ExecuteNonQuery()
Dim intAffected As Integer = cmd.ExecuteNonQuery()
Debug.Print(intaffected)

我在输出窗口中得到 1

【问题讨论】:

  • 什么是conn_str?你如何验证更新没有发生?大多数时候我看到这种症状,他们使用 Express 和用户实例 / attachdbfilename 并且正在更新数据库的实例与正在检查的实例不同。
  • 我有一个远景:您有一个表格,您想在其中更改值。在服务器单击事件中,您正在保存值(即 sn-p)。在页面加载中,您正在加载表单的值?!页面加载会在您存储之前覆盖输入的值......正如我所说的只是猜测,发生在我身上不止一次。
  • 从您的 SQL Profiler 输出中,参数中的值是您输入的数据吗?另外,我注意到 ID.ToString 已将您的 @id 参数强制为 nvarchar(1) 而不是 int。 SQL 应该有一个允许这样做的隐式转换,但我会更改您的代码,将此参数作为 int 并查看是否可以。
  • 在看到您关于值与原始值相同的评论后,听起来@PhilippMehrwald 是正确的,您正在恢复原始值,如果这是一个 Web 表单应用程序,最有可能在 Page_Load 中。至于解决 ID 数据类型问题,只需使用 cmd.Parameters.AddWithValue("@id", ID)
  • 假设这是一个 Web 表单应用程序,请确保将数据加载到文本框中的任何位置都在“如果不是 Page.IsPostback() then”中

标签: asp.net .net sql sql-server-2005


【解决方案1】:

一些想法:

  1. 如果您有权访问 SQL Profiler,则可以查看查询、值、结果、任何触发器、任何事务等。这是识别正在发生的事情的最简单方法。
  2. 如果您无权访问 Profiler,请更新您的查询以包含 OUTPUT 子句,并使用 ExecuteReader 将 insert.* 和 deleted.* 中的值返回到 SqlDataReader。检查结果。
  3. 如果 id 是 int,请不要在 parameter.AddWithValue 上使用 ID.ToString()。使用整数本身,因为带有字符串值的 AddWithValue 方法可能导致 ID 参数被配置为 varchar/nvarchar。

【讨论】:

  • Profiler 是肯定的。我用分析器开始了我四分之一的调试和逆向工程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 2016-11-11
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多