BeginnerCoderPete Ответов: 2

Необходимо объявить скалярную переменную " @employeeid"


Public Sub SqlSelectTimesAwaitingApproval(dgv as datagridview, listOfEmployees As List(Of integer))

    Dim con As New SqlConnection(My.Settings.AlphaCureCRMConnectionString)
    Dim cmd As New SqlCommand()
    Dim ds As New DataSet
    Try
        cmd.Connection = Con
        For Each intId As Integer In listOfEmployees
            Con.Open()
            cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = intId
            cmd.CommandText = "SELECT * FROM tblAttendanceTimes WHERE intApprovedOvertime = 0 AND fkEmployee = @EmployeeID"
            Dim da As New SqlDataAdapter() With
            {.SelectCommand = New SqlCommand(cmd.CommandText, con)}
            da.Fill(ds, "Table")
            con.Close()
            da.Dispose()
        Next
        Dgv.DataSource = ds.Tables("Table")
        ds.Dispose()
    Catch ex As Exception
        MsgBox(Ex.Message)
    Finally
        Cmd.Dispose()
    End Try
End Sub


Не могу понять, почему я получаю эту ошибку, параметр определяется до того, как он вызывается. У меня это работало какое-то время, но что-то должно было измениться, и теперь я вообще не могу заставить это работать.

Что я уже пробовал:

Я пытался в основном просто изменить код, как он есть, но безрезультатно.

[no name]

"параметр определяется до того, как он будет вызван", где? Этого нет в коде, размещенном здесь. Название вашей публикации и код здесь не совпадают.

BeginnerCoderPete

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

[no name]

"Заголовок-это сообщение об ошибке", если это правда, то почему вы его изменили? Это название Вашего сообщения, где вы должны рассказать нам о своей проблеме? подсказка: нет, это не так.

BeginnerCoderPete

Спасибо за помощь.

PIEBALDconsult

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

Создать команду
Набор текста
Добавьте параметры

для...
{
Установите значения параметров
Выполнять
}

BeginnerCoderPete

Public Sub SqlSelectTimesAwaitingApproval(dgv as datagridview, listOfEmployees As List (of integer))

Dim con как новый SqlConnection(My. Settings.AlphaCureCRMConnectionString)
Dim cmd как новая SqlCommand()
Dim da как новый SqlDataAdapter(cmd)
Дим ДТ в качестве нового объекта DataTable
Попробуй
УМК.Подключение = Кон
УМК.CommandText = " SELECT * FROM tblAttendanceTimes WHERE intApprovedOvertime = 0 AND fkEmployee = @Employee"
УМК.Параметры.Добавить("@Сотрудника", Значения Sqldbtype.Инт)
Для каждого intId как целое в listOfEmployees
УМК.Параметров("@Сотрудника").Значение = intId
против.Открыть()
да.Заполнить(ДТ)
против.Закрывать()
Следующий
Поймать ex как исключение
MsgBox(Например, Сообщение)
Окончательно
да.Распоряжаться()
УМК.Располагать()
dgv.Источник данных = ДТ
Конец Попытки
Конец Подводной Лодки

- Лучше?

PIEBALDconsult

Лучше, но не открывайте и не закрывайте соединение в цикле.

PIEBALDconsult

Смотреть также:
https://www.codeproject.com/script/Forums/View.aspx?fid=1649&МСГ=4052816

BeginnerCoderPete

Спасибо

2 Ответов

Рейтинг:
16

OriginalGriff

Вы добавляете Параметр команды к исходной команде, а не к той, из которой вы заполняете свой набор данных через адаптер:

cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = intId
                cmd.CommandText = "SELECT * FROM tblAttendanceTimes WHERE intApprovedOvertime = 0 AND fkEmployee = @EmployeeID"
                Dim da As New SqlDataAdapter(cmd) With 
                {.SelectCommand = New SqlCommand(cmd.CommandText, con)}
                da.Fill(ds, "Table")

Попробовать это:
cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = intId
cmd.CommandText = "SELECT * FROM tblAttendanceTimes WHERE intApprovedOvertime = 0 AND fkEmployee = @EmployeeID"
Dim da As New SqlDataAdapter(cmd)
da.Fill(ds, "Table")


BeginnerCoderPete

{ Дим кон как новое sqlconnection(мой.Параметры.AlphaCureCRMConnectionString)
Dim cmd как новая SqlCommand()
Dim ds как новый набор данных
Попробуй
УМК.Подключение = Кон

Для каждого intId как целое в listOfEmployees
Кон. Открыт()
УМК.Параметры.Добавить("@Кодсотрудника", Значения Sqldbtype.Инт).Значение = intId
УМК.CommandText = " SELECT * FROM tblAttendanceTimes WHERE intApprovedOvertime = 0 AND fkEmployee = @EmployeeID"
Dim da как новый SqlDataAdapter(cmd)
da. Fill(ds, " таблица")
да.Распоряжаться()
против.Закрывать()
Следующий
УМК.Располагать()
Dgv.Источник данных = ДС.Таблицы("Таблица")
ДС.Распоряжаться()
Поймать ex как исключение
MsgBox(Например, Сообщение)
Окончательно
УМК.Распоряжаться()
Конец Попытки}

Вот как у меня сейчас, но теперь я получаю ошибку "имя переменной было объявлено", но, надеюсь, я доберусь туда отсюда. Спасибо. До сих пор это, кажется, помогало.

PIEBALDconsult

Потому что вы все еще добавляете параметр в цикл-что неправильно; это приводит к дублированию параметров.

BeginnerCoderPete

Спасибо, теперь мне удалось разобраться с этим, используя cmd. parameters. clear, прежде чем он снова зациклится.

PIEBALDconsult

Нет, пожалуйста, не делай этого.
Создайте и добавьте параметр перед циклом, а затем в цикле просто установите значение.

BeginnerCoderPete

Честно говоря, я не был уверен, как создать параметры вне цикла.
Из любопытства, Что плохого в очистке параметров?

PIEBALDconsult

Неэффективный. Если вам нужно сделать цикл миллионы раз, вы узнаете.

BeginnerCoderPete

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

PIEBALDconsult

Может быть, сегодня, а может быть, и не на следующей неделе.

BeginnerCoderPete

Что ты имеешь в виду?

OriginalGriff

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

BeginnerCoderPete

О, хорошо, да, я полностью согласен.

Рейтинг:
1

PIEBALDconsult

УМК.Параметры.Добавить("@Кодсотрудника", Значения Sqldbtype.Инт).Значение = intId
cmd. CommandText = " SELECT * FROM tblAttendanceTimes WHERE intApprovedOvertime = 0 AND fkEmployee = @EmployeeID"
Dim da как новый SqlDataAdapter () с
{. SelectCommand = New SqlCommand(cmd. CommandText, con)}

Может быть, ты имел в виду...

{. SelectCommand = cmd}


BeginnerCoderPete

Да, это, кажется, помогло мне до сих пор, я должен быть в состоянии решить все остальное отсюда, я надеюсь.