2014-09-22 4 views
0

Код работал отлично в течение длительного времени, пока кто-то не добавил новое имя (SE01) в базу данных SQL, из-за чего веб-программа вылетает из строя. Веб-ошибка показала, чтоОшибка запроса SQL Union с помощью vb.net

System.InvalidCastException: Conversion from string "SE01" to type 'Integer' 
is not valid. 

наряду с другой ошибкой запроса SQL Union,

SELECT Substring([Name],@lenSrv, 8) as Name 
FROM [dbo].[ServerOwners] 
where [Name] like @Srv 
and Name not like '%j%' 
union 
SELECT Substring([Server],@lenSrv, 8) as Name 
FROM [dbo].[AuditLog] 
where log='delete' 
and [DATE] > (GETDATE() - 60) 
and [SERVER] like @Srv 
and Server not like '%j%' 
order by [name] 

кода задачей найти следующее доступное имя через базу данных с помощью запроса, например, существует имя_сервер в базе данных UXVP001, и код найдет бесплатный, который будет UXVP002. Теперь кто-то добавил UXVPSE01 в базу данных SQL, которая, кажется, вызывает запрос чтения. Я хочу, чтобы это было принято/проигнорировано новым именем без ошибок.

Здесь пропущено VB коды, поиск по базе данных,

srv = "UXPV" 
sqlAddOn = "and Name not like '%j%'" 
sqlAddOnAudit = "and Server not like '%j%'" 

     "Logic to find next available name" 
     "1. select the numbers to the right of the characters" 
     "2. loop all values and find first missing number" 
     Dim sqlConn As New System.Data.SqlClient.SqlConnection((ConfigurationManager.ConnectionStrings("SOCT").ConnectionString)) 
     Dim strSql As String = "SELECT Substring([Name],@lenSrv, 8) as Name FROM [dbo].[ServerOwners] where [Name] like @Srv " & sqlAddOn 
     strSql &= " union " 
     strSql &= "SELECT Substring([Server],@lenSrv, 8) as Name FROM [dbo].[AuditLog] where log='delete' and [DATE] > (GETDATE() - 60) and [SERVER] like @Srv " & sqlAddOnAudit 
     strSql &= " order by [name]" 
     Dim cmd As New System.Data.SqlClient.SqlCommand(strSql, sqlConn) 
     Dim dr As System.Data.SqlClient.SqlDataReader 

     LabelError.Text = "" 
     Dim x As Integer = 1 
     Dim y As Integer = 1 
     Dim foundYet As Boolean = False 
     Try 
      sqlConn.Open() 
      cmd.Parameters.AddWithValue("@lenSrv", srv.Length + 1) 
      cmd.Parameters.AddWithValue("@Srv", srv & "%") 

      dr = cmd.ExecuteReader() 

      While dr.Read() And foundYet = False 
      LabelError.Text = LabelError.Text & dr("Name") & " | " 
      y = CType(dr("Name"), Integer) 
      If x = y Then 
       "keep going" 
       x = x + 1 
      Else 
       "you found first available number" 
       foundYet = True 
      End If 
     End While 

     dr.Close() 
     cmd.Dispose() 
    Catch ex As Exception 
     hide() 
     PanelError.Visible = True 
     LabelError.Text = ex.ToString() & "<hr/>" & strSql 
    Finally 
     sqlConn.Dispose() 

    End Try 

    "make sure leading zeros are present" 
    " 000" 
    Dim fmt As String = "00#" 
    tbAdd_ServerName.Text = srv & x.ToString(fmt) 
    tbAdd_ServerName.Enabled = False 

    tbAdd_TM.SelectedValue = "*" 
+0

Часть информации, которую вы не указали, состоит в том, что ее ошибка в строке 'y = CType (dr (« Name »), Integer)' right? –

ответ

1

Конечно, это не работает. Вы делаете все справа от UXPV, а затем рассматриваете это значение как число. Но у вас больше нет номера для этого значения для одной записи.

Так что вам нужно избавиться от плохой записи и изменить пользовательский интерфейс, чтобы в будущем тип данных не мог быть добавлен. Или вам нужно исправить код для разметки всех буквенных символов.

0

я понял, что все, что я должен был сделать, это добавить игнорировать «СЭ», как это,

sqlAddOn = "and Name not like '%j%' and Name not like '%se%'" 
sqlAddOnAudit = "and Server not like '%j%' and Server not like '%se%'" 

Теперь работает и обратно к поиску, как она, предполагают, чтобы быть.

Смежные вопросы