【问题标题】:How to check if Current ID exits in that table or not如何检查当前 ID 是否存在于该表中
【发布时间】:2009-09-22 07:00:18
【问题描述】:

我正在使用 VB.net 和 Sql server 2005。

我在有 CPUserID 的应用程序中有 GridView。 GridView 中可能有数千条具有不同 CPUserID 的记录。

现在我有一个按钮“分配令牌”。但在分配令牌之前,我想检查我的 Token 表,如果该 CPUserID 已经存在于表中,它不应该允许用户分配令牌,并且会为该用户返回一些消息。

 For Each curRow As GridViewRow In GridView1.Rows
            Dim cpuserid As Label = CType(curRow.Cells(1).FindControl("lblCPUserID"), Label)                
        Next

TOKEN表结构如下:

TokenID、CPUserID、StatusID(全整数)

请推荐!一些示例代码

【问题讨论】:

  • 你如何发布你的代码尝试......
  • 另外,您使用什么技术访问数据库?普通 ADO.NET、LINQ to SQL、数据集...?
  • 对不起,伙计们,我正在使用 VB.net,我正在使用数据集以及 SQL Proc。

标签: vb.net sql-server-2005


【解决方案1】:

对 Token 表执行查询以查看该表中是否已经存在与给定 id 对应的行:

SELECT COUNT(*) FROM Token WHERE CPUserID = 5

例如。

为了在 VB.NET 中执行此操作,您必须使用 SqlConnectionSqlCommand 类。 此外,请务必使用参数化查询。

在 C# 中,代码大致如下:

SqlConnection conn = new SqlConnection ("here comes the connectionstring to the db.");

conn.Open();
try
{
    SqlCommand cmd = new SqlCommand ();
    cmd.Connection = conn;
    cmd.CommandText = "SELECT COUNT(*) FROM Token WHERE CPUserId = :p_UserId";
    cmd.Parameters.Add ("p_UserId", SqlDbType.Int32).Value = 5;
    object result = cmd.ExecuteScalar();

    if( Convert.ToInt32(result) > 0 )
    {
         MessageBox.Show ("Token already exists for user");
    }
}
finally
{
     conn.Close();
}

为了提高性能,您必须确保在 Token 表上创建正确的索引。 CPUserId 上的索引可能会对此查询有所帮助。

【讨论】:

  • 实际上,使用 IF EXISTS() 而不是 COUNT(*)
  • 您是程序员 Yuvraj,还是希望将所有内容都写出来以便您直接输入的代码猴子?存在诸如手册和帮助之类的东西,所以你现在有一些提示,我想你可以开始四处看看,不是吗?
  • 米奇:为什么 IF EXISTS( SELECT ... ) 会更好?
  • Frederik 我只是想知道哪种解决方案更适合使用 Count 或 If Exists。请不要消极对待。如果伤害到你我很抱歉
【解决方案2】:

首先感谢所有回答这个问题的人。

我通过以下解决方案解决了上述问题:

SQL 过程:

我在 SQL Server 2005 中创建了一个过程

GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[uspUpdateAllocateToken]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[uspUpdateAllocateToken]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[uspUpdateAllocateToken]
( @CPUserID INT)
AS

IF NOT EXISTS(SELECT TokenID FROM tblToken WHERE CPUserId=@CPUserID AND StatusID IN (41,47))
BEGIN

UPDATE tblToken
SET 
CPUserID = @CPUserID,
StatusID=47

WHERE
 tblToken.TOKENID = (SELECT TOP 1 TOKENID FROM TBLTOKEN WHERE CPUSERID IS NULL AND STATUSID = 40)
END

在我的应用程序中进一步点击按钮。我写下面的代码:

Protected Sub ibtnAllocateTokens_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ibtnAllocateTokens.Click
        Try
            Dim conString As String = WebConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString
            Dim con As New SqlConnection(conString)
            con.Open()
            Dim cmd As SqlCommand
            For Each gvRow As GridViewRow In GridView1.Rows
                cmd = New SqlCommand("uspUpdateAllocateToken", con)
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.Add("@CPUserID", SqlDbType.Int).Value = CType(gvRow.Cells(1).FindControl("lblCPUserID"), Label).Text
                cmd.ExecuteScalar()
                lblAllocateTokenMessage.Visible = True
            Next

        Catch ex As Exception
            ErrorHandler.WriteError(ex.Message)
        End Try
    End Sub

请查看并告诉我此实现是否有任何问题。

干杯!

【讨论】:

  • 如果你的 SP 没有返回任何东西,你也可以使用 ExecuteNonQuery 代替 ExecuteScalar。
猜你喜欢
  • 2020-03-21
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2018-10-23
  • 2016-09-21
相关资源
最近更新 更多