2016-01-14 5 views
-1

Я пытаюсь выполнить параметры Переходим к SQL INSERT заявление через VB.NET:Передача параметров в SQLCommandText

Using cnn As SqlConnection = New SqlConnection(conn) 
       cnn.Open() 
       Using insertTrans As SqlTransaction = cnn.BeginTransaction 
        Using cmd As SqlCommand = cnn.CreateCommand() 
         'skip 1st row 
         Dim firstRow As Boolean = True 
         For Each item As String In lines 
          cmd.CommandText = "INSERT INTO [matrixtest].[dbo].[SM_Fatca_GinList] VALUES (@gin, @name, @country)" 
          If Not firstRow Then 
           item = item.Replace(""" ,", """,") 
           item = item.Replace(", """, ",""") 
           item = item.Replace(""",""", """__||__""") 
           item = item.Replace("""", "") 
           fields = item.Split("__||__") 
           If Not String.IsNullOrEmpty(fields(0)) Then 
            If Not fields(0).Length = 0 Then 
             cmd.Parameters.AddWithValue("@gin", fields(0)) 
             cmd.Parameters.AddWithValue("@name", fields(1)) 
             cmd.Parameters.AddWithValue("@country", fields(2)) 
            End If 
           End If 
          End If 
          firstRow = False 
          cmd.Transaction = insertTrans 
          cmd.ExecuteNonQuery() 
         Next 
        End Using 
       End Using 
      End Using 

я получаю эту ошибку: Must declare the scalar variable "@gin".

Это выглядит как ошибка SQL, но почему я должен объявить переменные в SQL, не я просто использую этот синтаксис для передачи параметров? Что я делаю неправильно и как это исправить?

+0

Вы условно добавляете параметры. Вы должны добавлять параметры всякий раз, когда задан текст команды. – Sunil

+0

Если в таблице DB имеется более 3 столбцов, вы должны указать их в SQL. В противном случае он действительно не знает, как их сопоставить. Главное, что вы делаете addwithvalue в цикле, поэтому каждый раз добавляется еще один параметр @gin, а другой и другой .... Создайте 3 параметра один раз, а затем просто установите/сбросьте значение при повторении. Также, если 'lines 'все еще является списком,' Lines.RemoveAt (0) 'будет удалять заголовок вместо этого bool – Plutonix

+0

@Plutonix Как вы создаете параметры без их настройки? –

ответ

1

Поскольку вы добавляете параметры только в том случае, когда определенное условие истинно, вы должны перенести выполнение команды на тот же if, в котором вы устанавливаете значения параметров. В противном случае будут ситуации, когда параметры команды не будут установлены/добавлены, но команда все еще выполняется, в результате чего возникает ошибка.

Измените ваш код так, как показано ниже.

If Not firstRow Then 
    item = item.Replace(""" ,", """,") 
    item = item.Replace(", """, ",""") 
    item = item.Replace(""",""", """__||__""") 
    item = item.Replace("""", "") 
    fields = item.Split("__||__") 
    If Not String.IsNullOrEmpty(fields(0)) Then 
     If Not fields(0).Length = 0 Then 
      cmd.Parameters.AddWithValue("@gin", fields(0)) 
      cmd.Parameters.AddWithValue("@name", fields(1)) 
      cmd.Parameters.AddWithValue("@country", fields(2)) 
      //moved the below 3 lines to within this IF 
      //this is necessary for missing @gin error to be not thrown 
      firstRow = False 
      cmd.Transaction = insertTrans 
      cmd.ExecuteNonQuery() 
     End If 
    End If 
End If 
0

cmd.Parameters.AddWithValue("gin", fields(0)) cmd.Parameters.AddWithValue("name", fields(1)) cmd.Parameters.AddWithValue("country", fields(2))

Удалите @, когда вы делаете AddWithValue.

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