【问题标题】:How do I get SqlCommand ExecuteNonQuery result?如何获得 SqlCommand ExecuteNonQuery 结果?
【发布时间】:2011-08-29 08:53:24
【问题描述】:

为了检查特定用户是否为 db_owner,我执行以下查询:

"select is_rolemember('db_owner', '" & p_userName & "')"

使用SqlCommand ExecuteNonQuery 方法。

如何获取查询结果?

这是我的代码:

    Dim com As SqlCommand = New SqlCommand(sql, m_connection)               
    com.ExecuteNonQuery()

sql 是查询,m_connection 是连接字符串。

【问题讨论】:

    标签: sql vb.net sql-server-2008


    【解决方案1】:

    您可以使用ExecuteScalar

    执行查询,并返回第一行的第一列 查询返回的结果集。额外的列或行是 忽略。

    就像卢塞罗所说的那样。

    前:

    cmd.CommandText = "SELECT COUNT(*) FROM dbo.region";
    Int32 count = (Int32) cmd.ExecuteScalar();
    

    返回Int

    【讨论】:

      【解决方案2】:

      虽然每个人都给出了答案,但我想指出,如果 p_userName 无论如何都会受到客户端的影响,那么您的 sql 很容易受到注入。

      还要注意 is_rolemember 可以返回 Null (See Microsoft Reference) 下面是一个不易受 Sql Injection 攻击的实现(它使用参数化 sql)。

      Dim com As SqlCommand = New SqlCommand("select is_rolemember('db_owner', @UserName)", m_connection)
      com.Parameters. AddWithValue("@UserName", p_userName)
      Dim result As Object = com.ExecuteScalar
      If (result = DBNull.Value) Then
         Throw New Exception("database_principal or role is not valid, or you do not have permission to view the role membership.")
      Else
          Return CType(result,Int32)
      End If
      

      【讨论】:

        【解决方案3】:

        您需要使用ExecuteScalar,而不是ExecuteNonQuery

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-08
          • 2021-01-29
          • 1970-01-01
          • 1970-01-01
          • 2011-01-28
          • 2012-05-21
          • 2015-05-10
          • 1970-01-01
          相关资源
          最近更新 更多