2013-04-28 6 views
0

Я продолжаю получать сообщение об ошибке data type mismatch in criteria expression, когда я пытаюсь запустить параметризованный оператор sql в VB.Net в db ms-access db (.accdb).Несоответствие типов данных в выражении критериев.

Проблема с @PartNumber, что я знаю, потому что я жестко запрограммировал ее, чтобы получить значение из массива, и это сработало. Я просто не знаю, как это исправить.

PartNumber в таблице есть поле TEXT, и это строка в VB.Net, его длина составляет 20 в таблице, и далеко не 20 в форме Vb читается в.

Вот проблематичной код:

For i As Integer = 0 To trackParts.GetUpperBound(0) - 1 
    If (trackParts(i, 4) = "1") Then 
     cmd.CommandText = "INSERT INTO ServiceParts ([IncidentNumber], [PartNumber], [Quantity]) Values (@IncidentNumber, @PartNumber, @Quantity);" 
     cmd.Parameters.AddWithValue("@IncidentNumber", incidentNumberLabel.Text() 
        .ToString().ToUpper().Trim()) 
     cmd.Parameters.AddWithValue("@PartNumber", trackParts(i, 0) 
        .ToString.ToUpper().Trim()) 
     cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(trackParts(i, 3))) 
     cmd.ExecuteNonQuery() 
    End If 
Next 

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

+0

Опубликовать определение таблицы. Вероятно, это несоответствие определенным типам столбцов и вашим данным. – RBarryYoung

+0

Попробуйте назначить 'trackParts (I, 0)' временной переменной правильного типа и использовать temp в вызове 'AddWithValue'. –

+0

Как я могу опубликовать определение таблицы? Слишком много времени для публикации текста. Но PartNumber в таблице - это тип данных TEXT и то, что я посылаю к нему. Я помещаю ToString(), в довершение всего, что это тип данных String. EDIT: Питер, я уже пробовал это. Произошла такая же ошибка. – Josiah

ответ

0

Хотя это не совсем ответ сам по себе, это точный код, который работает правильно для меня в Visual Web Developer 2010. Единственное изменение, которое я сделал содержимое вашего For цикла является то, что я изменил условие конца цикла от trackParts.GetUpperBound(0) - 1 до trackParts.GetUpperBound(0), потому что у моего массива тестовых данных была только одна строка.

Таблица: [ServiceParts]
IncidentNumber - Текст (255)
PartNumber - Текст (255)
Количество - Количество (Long Integer)
(. Нет PK, нет индексов)

Смотрите, если что-то здесь немного отличается от того, что делает ваш код:

Public Class _Default 
    Inherits System.Web.UI.Page 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    End Sub 

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim trackParts(0, 4) As String 
     trackParts(0, 0) = "PartNumber01" 
     trackParts(0, 1) = "filler" 
     trackParts(0, 2) = "filler" 
     trackParts(0, 3) = "3" 
     trackParts(0, 4) = "1" 

     Dim con As New OleDb.OleDbConnection 
     con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\__tmp\testData.accdb;" 
     con.Open() 
     Dim cmd As New OleDb.OleDbCommand 
     cmd.Connection = con 
     For i As Integer = 0 To trackParts.GetUpperBound(0) 
      If (trackParts(i, 4) = "1") Then 
       cmd.CommandText = "INSERT INTO ServiceParts ([IncidentNumber], [PartNumber], [Quantity]) Values (@IncidentNumber, @PartNumber, @Quantity);" 
       cmd.Parameters.AddWithValue("@IncidentNumber", incidentNumberLabel.Text().ToString().ToUpper().Trim()) 
       cmd.Parameters.AddWithValue("@PartNumber", trackParts(i, 0).ToString.ToUpper().Trim()) 
       cmd.Parameters.AddWithValue("@Quantity", Convert.ToInt32(trackParts(i, 3))) 
       cmd.ExecuteNonQuery() 
      End If 
     Next 
     con.Close() 
    End Sub 
End Class 
Смежные вопросы