首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >检查行是否已存在

检查行是否已存在
EN

Stack Overflow用户
提问于 2013-03-30 17:52:55
回答 3查看 759关注 0票数 0

我正在尝试验证注册表单,以检查用户名/姓名+姓氏是否已经存在。

这是我尝试过的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dim conn As New SqlConnection("Data Source=BRIAN-PC\SQLEXPRESS;Initial Catalog=master_db;Integrated Security=True")
    Dim registerSQL As SqlCommand
    Dim checkCredentialsSQL As SqlCommand
    Dim sqlComm As String
    Dim sqlCommName As String
    Dim sqlCommUsername As String

    sqlComm = "INSERT INTO users(Username, Password, Name, Surname, Address1, Address2, " +
        "City, Country, date_of_birth, age, Occupation, department, work_location, " +
        "project_manager,team_leader, team_leader_id, project_manager_id, " +
        "date_registration, contract_type, contract_duration) " +
        "VALUES(@p1, @p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,@p10,@p11,@p12,@p13,@p14,@p15," +
        "@p16,@p17,@p18,@p19,@p20)"

    sqlCommName = "SELECT name, surname FROM users WHERE name='" + txtName.Text + "' and surname='" + txtSurname.Text + "'"
    sqlCommUsername = "SELECT username FROM users WHERE username='" + txtUsername.Text + "'"

    conn.Open()

    checkCredentialsSQL = New SqlCommand(sqlCommName, conn)


    If checkCredentialsSQL.ExecuteScalar IsNot Nothing Then

        lblName.Text = txtName.Text + " " + txtSurname.Text + "is already registered."
        lblName.Visible = True


    Else

        checkCredentialsSQL = New SqlCommand(sqlCommUsername, conn)

        If checkCredentialsSQL.ExecuteScalar IsNot Nothing Then

            lblUsername.Text = "'" + txtUsername.Text + "' is already taken."

        Else


            registerSQL = New SqlCommand(sqlComm, conn)
            registerSQL.Parameters.AddWithValue("@p1", Username)
            registerSQL.Parameters.AddWithValue("@p2", Password)
            registerSQL.Parameters.AddWithValue("@p3", Name)
            registerSQL.Parameters.AddWithValue("@p4", Surname)
            registerSQL.Parameters.AddWithValue("@p5", Address1)
            registerSQL.Parameters.AddWithValue("@p6", Address2)
            registerSQL.Parameters.AddWithValue("@p7", City)
            registerSQL.Parameters.AddWithValue("@p8", Country)
            registerSQL.Parameters.AddWithValue("@p9", DOB)
            registerSQL.Parameters.AddWithValue("@p10", Age)
            registerSQL.Parameters.AddWithValue("@p11", Occupation)
            registerSQL.Parameters.AddWithValue("@p12", Department)
            registerSQL.Parameters.AddWithValue("@p13", WorkLocation)
            registerSQL.Parameters.AddWithValue("@p14", ProjectManager)
            registerSQL.Parameters.AddWithValue("@p15", TeamLeader)
            registerSQL.Parameters.AddWithValue("@p16", TeamLeaderID)
            registerSQL.Parameters.AddWithValue("@p17", ProjectManagerID)
            registerSQL.Parameters.AddWithValue("@p18", RegistrationDate)
            registerSQL.Parameters.AddWithValue("@p19", ContractType)
            registerSQL.Parameters.AddWithValue("@p20", ContractDuration)

            registerSQL.ExecuteNonQuery()



        End If

    End If

    conn.Close()

这样做可行/安全/推荐吗?

EN

回答 3

Stack Overflow用户

发布于 2013-03-30 19:17:31

下面是一个简单的存储过程,它检查您想要检查的两个条件(下面将详细介绍):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE PROCEDURE dbo.CreateUser
  @username NVARCHAR(255),
  @name     NVARCHAR(64),
  @surname  NVARCHAR(64)
  /* ... other params ... */
AS
BEGIN
  SET NOCOUNT ON;

  IF EXISTS (SELECT 1 FROM dbo.users WHERE username = @username) 
  BEGIN
    RAISERROR('Username %s is already registered.', 11, 1, @username);
    RETURN -1;
  END

  IF EXISTS (SELECT 1 FROM dbo.users WHERE name = @name AND surname = @surname) 
  BEGIN
    RAISERROR('Name %s %s is already registered.', 11, 1, @name, @surname);
    RETURN -2;
  END

  BEGIN TRY
    INSERT dbo.Users(username,  name,  surname,  ...other columns...)
             SELECT @username, @name, @suername, ...other params...;
  END TRY
  BEGIN CATCH
    DECLARE @msg NVARCHAR(255) = ERROR_MESSAGE();
    RAISERROR(@msg, 11, 1);
    RETURN -3;
  END CATCH
END

现在,您的VB.Net代码就简单多了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dim conn As New SqlConnection("...conn string...")
conn.Open()
Dim sql As New SqlCommand("dbo.CreateUser", conn)
sql.CommandType = CommandType.StoredProcedure
rv = sql.Parameters.Add("@rv", SqlDbType.Int)
rv.Direction = ParameterDirection.ReturnValue    

sql.Parameters.AddWithValue("@username", Username)
sql.Parameters.AddWithValue("@name",     Name)
sql.Parameters.AddWithValue("@surname",  Surname)
... other params ...

sql.ExecuteNonQuery()
Debug.Print "Return value: " & rv.ToString

...act accordingly depending on error raised and/or return value     
...maybe you want TRY/CATCH here?

conn.Close()

虽然尝试插入(使用WHERE子句,或者只是让约束引发错误)在技术上可能是一种可行的方法,但我不认为这是一个好主意。第一个原因是您的代码不能告诉您是哪种情况导致了问题,第二个原因是让SQL Server为您引发异常的代价非常高:

http://www.sqlperformance.com/2012/08/t-sql-queries/error-handling

http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/

当然,这并不意味着你不应该有潜在的约束。它们应该在用户不通过存储过程、应用层等的情况下使用。

哦,我同意其他人的观点。你真的认为只有一个约翰·史密斯会注册吗?与他人同名并不是阻止某人注册IMHO的一个非常有效的理由。

另外,如果我的VB.Net代码远不完美,我向您道歉。我不是用VB写的,其中一些是有根据的猜测……

票数 1
EN

Stack Overflow用户

发布于 2013-03-30 18:05:04

sqlCommName命令不受SQL注入的保护。如果txtName.Text包含existing_username AND 1 = 0,则用户可以注册两次。

票数 0
EN

Stack Overflow用户

发布于 2013-03-30 18:51:59

尽管我不同意您使用的标准(因为name+surname几乎肯定不是一个人的惟一标识符),但一般形式应该是一个尝试的INSERT

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO TabA (Val1,Val2,Val3)
SELECT @Val1,@Val2,@Val3
WHERE NOT EXISTS (SELECT * FROM TabA where Val1 = @Val1 or (Val2 = @Val2 and Val3 = @Val3)

否则,您仍然将自己暴露在竞争条件下。

而且,根据您正在运行的并发设置,您可能仍然需要处理违反约束的情况(我假设您也在数据库级别强制执行任何唯一性约束)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15721596

复制
相关文章
戴尔曝eDellRoot根证书后门
今年早些时候,联想电脑被发现预装了Superfish广告程序,这款软件会增加用户受到黑客攻击的风险,一时引发了大量讨论,而最近,Duo实验室的安全研究人员在戴尔Inspiron 14笔记本中发现了一些奇怪的证书,这些证书同样会增加用户受到黑客攻击的风险。 研究人员的发现 研究人员在戴尔电脑上发现两个证书,包括一款被信任的eDellRoot根证书 使用了这些证书的系统中的一个提供HTTPS web服务的系统是一个SCADA (supervisory control and data acquisitio
FB客服
2018/02/07
1.1K0
戴尔曝eDellRoot根证书后门
戴尔笔记本怎么样?强大性能让你服!
对笔记本电脑产品关注比较少的朋友们可能对英特尔Evo平台比较陌生,这个平台上汇集了英特尔和一些顶级笔记本电脑的制造商合作设计的一系列高端笔记本电脑。比如戴尔XPS 9310就是其中的一款产品,它可选全新第11代英特尔® 酷睿™ i7-1185G7处理器和英特尔锐炬Xe图形处理器,处理器睿频高至4.8 GHz。更具象地说,它能充分满足商务办公、日常学习的需求,给到用户出色性能新体验。
云上计算
2021/02/04
5490
戴尔笔记本怎么样?强大性能让你服!
高通CEO:ChatGPT热潮之下,手机将成AI主流设备,将带动高通成为AI公司
3月4日消息,研究机构 Bernstein 分析师近日出具的一份报告指出,随着ChatGPT 的应用,将为芯片制造商创造一个每年价值数百亿美元的新市场。对此,许多芯片制造商无不摩拳擦掌,为即将到来的可观市场“钱景”蓄势待发。移动芯片制造商高通(Qualcomm)表示,ChatGPT 的爆红,不但展现智能手机将成为强大 AI设备的可能性,同时也是让高通进一步成为 AI 公司的里程碑。
芯智讯
2023/03/24
3020
高通CEO:ChatGPT热潮之下,手机将成AI主流设备,将带动高通成为AI公司
QXDM打印高通sensor 日志问题总结
在使用QXDM打印高通sensor日志的时候,经常会发现有些赋予已经权限很高的log居然打印不出来,这就个代码的追踪带来了一系列困难,鉴于此,我研究了一下高通中log打印问题,给大家今后的使用带来一些经验。 在高通的关于日志的头文件定义中,许多日志是默认不打开的,研究代码:
全栈程序员站长
2022/11/10
8020
SQL操作四
文章目录 1. Day 04 1.1. 创建数据库和表 1.1.1. 商城建表语句 1.1.2. 员工建表语句 1.2. group by 1.3. having子句 1.4. 子查询 1.4.1. Mysql子查询 1.4.2. 总结 1.5. 关联查询 1.5.1. 笛卡尔积 1.5.2. 等值连接/内连接 1.5.2.1. 等值连接 1.5.3. 内连接 1.5.4. 总结 1.6. 左外连接 1.7. 右外连接 1.8. 案例 1.9. 总结 Day 04 创建数据库和表 商城建表语句 DROP
爱撒谎的男孩
2019/12/31
7070
高通mdp_高通骁龙6150
样机上电之后如何自动选择合适的网络进行附着,如何对选择的小区确实是否可以驻守,本文将以高通平台为例,讲述从识别SIM开始,到注册到合适的小区这整个流程。
全栈程序员站长
2022/11/08
1.6K0
高通mdp_高通骁龙6150
AMD、Apple、ARM围堵下,intel的“离婚冷静期”冷得刺骨
2021年1月1日,是新民法典中的离婚冷静期制度开始实行的日子。2020年的最后一月,国内的离婚风刮起了一波热潮。而这股风,好像也吹到了大洋彼岸的半导体行业,芯片行业似乎也感受到了离婚冷静期的压力,纷纷赶在2020年宣布离婚。而离婚最大的苦主,非intel莫属。
用户2908108
2021/01/12
5470
Wi-Fi 6 有多快?使用三款 Wi-Fi 6 路由器进行测试!
在无线网络世界中,有802.11b、802.11g、802.11n、802.11ac等技术,最近,Wi-Fi 6开始慢慢热了起来,新一代无线网络网络仍然是与以太网兼容的 IEEE 802.11 协议的一部分,被称为 802.11ax,现在越来越多的无线路由器、笔记本开始支持Wi-Fi 6,那么Wi-Fi 6到底有多快呢?今天来测试一下。
网络技术联盟站
2021/11/01
1.4K0
Wi-Fi 6 有多快?使用三款 Wi-Fi 6 路由器进行测试!
高通滤波
算法:高通滤波将傅里叶变换结果图像中的低频分量值都替换为0,即屏蔽低频信号,只保留高频信号,实现高通滤波。高通滤波器使低频信号衰减而让高频信号通过,将增强图像中尖锐细节,但是会导致图像对比度降低。高频信号对应图像内变化越来越快的灰度分量,是由灰度尖锐过渡造成的。
裴来凡
2022/05/28
6510
高通滤波
对标苹果M2!高通自研Oryon处理器已获戴尔采用
3月13日消息,据业界最新的传闻显示,高通全新打造的针对笔记本电脑的自研处理器“Oryon”将于今年下半年正式发布,目前已经获得了全球前三大笔记本电脑品牌戴尔的支持。
芯智讯
2023/03/24
3560
对标苹果M2!高通自研Oryon处理器已获戴尔采用
Android 功耗(3)---高通功耗问题分析方法
RPM Resource Power Manager是高通MSM平台另外加的一块芯片,控制整个电源相关的shared resources
233333
2020/09/08
2K0
Android 功耗(3)---高通功耗问题分析方法
python解析xps文件_xps文件的基本操作
最近一直研究XPS文件,目前已经解决了二进制流转XPS文件、XPS文件转二进流、XPS文件的解析、XPS文件转图片、XPS文件打印等。但是一直没有找到如何向xps文件中插入图片的方法,好烦恼啊!!!!如果那位大神有向xps文件中插入图片的方法请及时联系我谢谢,QQ470163177。本人研究的成果如下,需要的码友可以学习下。
全栈程序员站长
2022/09/06
7760
戴尔曝出五大漏洞,影响数百万 Inspiron、Vostro、XPS、Alienware 系统
据thehackernews消息,戴尔BIOS存在五个新的安全漏洞,如果这些漏洞被黑客利用,可能会导致在易受攻击的系统上执行代码。这与最近在Insyde Software 的InsydeH2O和 HP 统一可扩展固件接口 ( UEFI ) 中发现的固件漏洞类似。
FB客服
2022/04/12
3330
戴尔曝出五大漏洞,影响数百万 Inspiron、Vostro、XPS、Alienware 系统
高通QCC5125芯片_高通625超频内核
在/system/lib/modules目录下,动态安装内核模块时(insmod hello.ko)出现insmod: failed to load hello.ko: Required key not available
全栈程序员站长
2022/09/27
6880
wifi连接android设备进行调试
                    # setprop service.abd.tcp.port 5555
2018/09/03
8180
高通CamX架构
转载: https://deepinout.com/qcom-camx-chi/qcom-camx-overview.html
小驰行动派
2021/05/18
2.7K0
高通CamX架构
dotnet 枚举当前设备wifi热点
在 dotnet 程序没有现有的方法可以列举当前设备的无线网卡找到的 WIFI 热点,需要写一点代码才能使用
林德熙
2019/10/09
9820
dotnet 枚举当前设备wifi热点
dotnet 枚举当前设备wifi热点
在 dotnet 程序没有现有的方法可以列举当前设备的无线网卡找到的 WIFI 热点,需要写一点代码才能使用
林德熙
2022/08/07
5430
新年,高通裁员!!!
高通是著名的手机芯片制造商,根据华尔街日报的报道,高通对未来几个季度的业绩展望很悲观。
用户1564362
2023/01/10
1.1K0
零基础开发WIFI设备
shineblink core 开发板(简称Core)的库函数支持WIFI功能,所以只用几行代码即可实现基于esp8266 WIFI模块的联网通信(TCP, UDP, MQTT)功能。这里我们主要介绍通过TCP实现联网通信的功能,更多关于TCP, UDP, MQTT通信请前往shineblink.com 了解。
shineblink
2020/12/05
8970
零基础开发WIFI设备

相似问题

戴尔XPS 13开发者版Wifi问题

20

戴尔XPS 13睡眠问题

10

戴尔XPS 159520 wifi问题

20

戴尔XPS 13 (9370)蓝牙问题

50

戴尔XPS 13声音问题

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文