2010-06-24 2 views
0

Я просто зациклен на том, что делать с этим кодом, я просто пытаюсь реализовать улов «нет дубликатов» в моей форме вставляемого клиента, но он просто проскакивает через оператор if к другому. Это источник. Также я попробовал .equals с теми же результатами :(Сравнивать значения из источника данных с строкой

Protected Sub srcAllClients_Inserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs) Handles srcAllClients.Inserting 
     'Establish Variables 
     Dim emailAddress As String 
     Dim srcUsers As SqlDataSource = New SqlDataSource() 

     srcUsers.ConnectionString = ConfigurationManager.ConnectionStrings("ISSD21ConnectionString").ConnectionString 

     Dim view As DataView 
     view = DirectCast(srcUsers.Select(DataSourceSelectArguments.Empty), DataView) 
     srcUsers.SelectCommand = "SELECT EmailAddress FROM ISSDClients" 
     srcUsers.DataSourceMode = SqlDataSourceMode.DataReader 
     Dim reader As IDataReader 
     reader = DirectCast(srcUsers.Select(DataSourceSelectArguments.Empty), IDataReader) 

     emailAddress = FormView1.FindControl("txtEmail").ToString 

     While reader.Read() 
      If reader("EmailAddress") = (emailAddress) Then 
       lblError.Text = "Your Email is NOT Unique!" 
       'this is where we cancel the update and return an error 
      Else 
       lblError.Text = "Your Email is Unique!" 
       'nothing needs to happen, maybe just tell them that it went through 
      End If 
     End While 

     reader.Close() 
    End Sub 

ответ

4
emailAddress = FormView1.FindControl("txtEmail").ToString 

только собирается вернуть строку «System.Web.UI.WebControls.TextBox». Вы не доступом к фактической собственности контроль который будет содержать текстовое значение, вы просто вызываете ToString() на самом элементе управления.

Попробуйте это:

Dim emailBox As TextBox = CType(FormView1.FindControl("txtEmail"), TextBox); 
emailAddress = emailBox.Text 
+0

Хороший вопрос! Я пропустил это в своем оригинальном блеске ... – Achilles

+0

Thx для подсказки, прямо на деньги. Только код, который вы мне даете, ... Ошибка 1 'TextBox' является типом и не может использоваться как выражение. \t Ошибка 2 ')'. – javArc

+0

Ах, извините, мой VB довольно ржавый. Кастинг отличается - код должен быть emailAddress = CType (FormView1.FindControl ("txtEmail"), TextBox) .Text – womp

0

В дополнение к ответу WOMP в ...

В то время цикла, который работает через почтовые записи, вы должны выйти из цикл, как только вы найти соответствующий адрес электронной почты и оповещения пользователя.

if reader("EmailAddress") = (emailAddress) then 
    '1. Break from the Loop 
End if 
0

Я рекомендовал бы передать emailAddress к SQL Server в качестве параметра.

Select Count(EmailAddress) From ISSDClients 
Where EmailAddress = @EmailAddress 

Выполнить это утверждение, используя ExecuteScalar и бросили результат в виде целого числа. Если результат равен нулю, тогда вы в порядке, иначе отобразите ошибку.

Выполнение этого способа позволяет избежать использования цикла while и должно быть намного быстрее, если в таблице много строк.

Вам также необходимо получить свойство Text из текстового поля электронной почты.

emailAddress = FormView1.FindControl("txtEmail").Text.ToString 
0

Вы можете взглянуть на String.Compare метод, который будет делать это легче сравнивать без уважения к вещам, как чувствительность к регистру и культуре. Он рассматривает пробелы как часть вашей строки, поэтому вы можете обрезать строку до ее вызова, чтобы помочь нормализовать.

Например, следующие строки будут считаться равными:

var firstString = "some StrinG to Compare "; 
var secondString = " somE string to COMPARE"; 

var equal = (String.Compare(firstString.Trim(), secondString.Trim(), StringComparison.InvariantCultureIgnoreCase) == 0); 
Смежные вопросы