检查数据库中是否已有记录(LinqToSql,vb.net)

时间:2013-08-21 13:01:49

标签: vb.net linq-to-sql

我需要一些帮助才能将我的数据(用户名和密码)插入到mssql数据库中。 使用linq到sql这是我的解决方案,但在 - >标记的行我总是得到一个EntityCommandExecutionException。我有一个带有两个文本框的html网站,我从中获取String并通过javascript发送请求 - ajax到vb.net。

我现在正在做研究很长时间,我找不到任何解决方案。

正如您所看到的,我想检查是否存在具有此用户名的数据行,但在表中没有数据行的情况下它不起作用。这意味着查询应该是'NULL'或者我错了吗?

Public Shared Function addData(ByVal username As String, ByVal passwort As String)

    Dim db = New LoginContext
    Dim benutzer = New Benutzer
    Dim available As Boolean = False
    Dim sha As New SHA1CryptoServiceProvider

    Dim vName = (_
        From b In db.BenutzerSet 
        Where b.Name = username.ToLower() 
        Select b)

  ->  If vName.Count() = 0 Or vName Is Nothing Then
        benutzer.Name = username.ToLower()

        Dim bytesToHash() As Byte

        bytesToHash = System.Text.Encoding.ASCII.GetBytes(passwort)

        bytesToHash = sha.ComputeHash(bytesToHash)

        Dim encPassword As String = ""

        For Each b As Byte In bytesToHash
            encPassword += b.ToString("x2")
        Next

        benutzer.Passwort = encPassword
        db.BenutzerSet.Add(benutzer)
        db.SaveChanges()
        available = True
    Else
        available = False
    End If
    Return available
End Function

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

使用vName.Any()检查您的查询中是否有任何记录!

->  If vName.Any() = false Then

也将Dim benutzer = New Benutzer更改为Dim benutzer As New Benutzer

答案 1 :(得分:2)

我对你的问题没有答案,但这里有一些反馈:

  1. 检查vName.Count() = 0 Or vName Is Nothing的顺序错误,因为VB从左到右执行它们。如果vName实际上是Nothing,那么您将获得NullReferenceException,因为vName.Count()首先执行。
  2. LINQ运算符(例如WhereSelect)实际上永远不会返回Nothing,因此您无需检查vName Is Nothing;这是多余的。
  3. 使用vName.Any()vName.Count() == 0具有相同的结果,但更具可读性,并且大部分时间都会在更高效的SQL查询中生成。
  4. 非常好,您正在哈希密码。但为了安全起见,您应该添加盐and don't use SHA as a hashing algoritm for storing passwords