Правильный синтаксис SqlParameter

Я пытаюсь преобразовать:

command.Parameters.Add (new SqliteParameter (DbType.Int32) { Value = id });

К обычному SqlParameter :

command.Parameters.Add(new SqlParameter(DbType.Int32) { Value = id });

Мне удалось преобразовать каждую строку, кроме этой, я получаю следующие ошибки:

Error   3   Argument 1: cannot convert from 'System.Data.DbType' to 'object[]'
Error   2   The best overloaded method match for 'System.Data.SqlClient.SqlParameter.SqlParameter(object[])' has some invalid arguments

Полный код функции:

public User GetUser(int id)
{
    var u = new User();
    lock (locker)
    {
        connection = new SqlConnection("Data Source=" + path + ";Initial Catalog=DB;User ID=sa;Password=***********th");
        connection.Open();
        using (var command = connection.CreateCommand())
        {
            command.CommandText = "Select * from tblUsers WHERE UserID = ?";
            command.Parameters.Add(new SqlParameter(DbType.Int32) { Value = id });
            var r = command.ExecuteReader();
            while (r.Read())
            {
                u = FromReader(r);
                break;
            }
        }
        connection.Close();
    }
    return u;
}

person Random    schedule 01.01.2014    source источник


Ответы (1)


Я думаю, что вы ищете что-то это;

command.Parameters.Add(new SqlParameter("@YourParameterName", SqlDbType.Int32).Value = id;

После редактирования вашего вопроса;

Вы можете использовать AddWithValue метод. Метод Add(String, Object) устарел. как;

command.CommandText = "Select * from tblUsers WHERE UserID = @id";
command.Parameters.AddWithValue("@id", id);

Если вы используете SQL Server в качестве базы данных, вы должны назвать свой параметр и добавить его в AddWithValue с тем же именем.

При использовании OleDbCommand< /a> порядок параметра важен. Потому что, как говорит MSDN:

Поставщик OLE DB .NET не поддерживает именованные параметры для передачи параметров в инструкцию SQL или хранимую процедуру, вызываемую OleDbCommand, когда для параметра CommandType задано значение Text. В этом случае необходимо использовать знак вопроса (?). Например:

SELECT * FROM Customers WHERE CustomerID = ?

Поэтому порядок, в котором объекты OleDbParameter добавляются в OleDbParameterCollection, должен напрямую соответствовать положению заполнителя вопросительного знака для параметра в тексте команды.

person Soner Gönül    schedule 01.01.2014
comment
Откуда мне знать, что вставлять в @YourParameterName? Функция SqliteParameter довольно проста. - person Random; 01.01.2014
comment
@Random Это имя параметра, в которое вы помещаете свою команду sql. Покажите свою команду sql также, чтобы выяснить, в чем именно заключается ваша проблема. - person Soner Gönül; 01.01.2014
comment
Код слишком длинный для комментария, и я не могу ответить на свой вопрос, потому что у меня меньше 10 репутации. - person Random; 01.01.2014
comment
@Random Просто введите соответствующую часть команды. Вы всегда можете отредактировать свой вопрос с помощью кнопки edit под своим вопросом. - person Soner Gönül; 01.01.2014
comment
Добавил в вопрос. Кроме того, еще вопрос, почему WHERE UserID = ?, знак вопроса я имею в виду. - person Random; 01.01.2014
comment
Так что я должен просто игнорировать command.Parameters.Add(new SqlParameter(DbType.Int32) { Value = id }); и заменить его на command.Parameters.AddWithValue("@id", id); ? - person Random; 01.01.2014
comment
@Random Да, метод Add устарел. Вместо этого вы должны использовать AddWithValue. Также не забудьте изменить UserID = ? на UserID = @id. - person Soner Gönül; 01.01.2014
comment
Просто примечание для уточнения: только Add(String, Object) устарел. Add(String, SqlDbType), Add(String, SqlDbType, Int32) и т. д. по-прежнему допустимы, и в некоторых случаях их лучше использовать вместо AddWithValue(String, Object). (msdn.microsoft .com/ru-ru/library/) - person fodder; 24.09.2015