Запрос UPDATE отлично работает при запуске из Access, но вызывает ошибку синтаксиса SQL из приложения C # - PullRequest
0 голосов
/ 16 декабря 2008

У меня есть очень простая инструкция Update, которая обновит настройки почтового сервера и информацию о сетевых учетных данных ... Запрос работает нормально, когда я запускаю его в Access, но C # выдает ошибку, сообщающую, что мой синтаксис SQL неверен ... I у меня есть слой dataaccess (класс dal) и метод экземпляра Update, вставленный ниже ... Но проблема должна быть в другом месте, потому что я обновил много вещей таким образом, но на этот раз это просто не сработает ... любые подсказки будут высоко оценены , Спасибо заранее.

Обновите метод экземпляра в классе DAL .. (это должен быть уровень доступа к данным :) Я просто выпускник управления: P

public int UpdateRow(string Query, bool isSP, params OleDbParameter[] args)
{
    int affectedRows = -1;
    using (con = new OleDbConnection(connStr))
    {
        using (cmd = con.CreateCommand())
        {
            cmd.CommandText = Query;
            if (isSP)
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (args != null)
            {
                foreach (OleDbParameter prm in args)
                {
                    cmd.Parameters.Add(prm);
                }
            }

            try
            {
            con.Open();
            affectedRows = cmd.ExecuteNonQuery();
            }
            catch(OleDbException ex)
            {
            throw ex;
            }
            catch (Exception ex)
            {
            throw ex;
            }
        }
    }
    return affectedRows;
}

И код ASP.NEt, который будет выполнять обновление =

protected void Update_Click(object sender, EventArgs e) {
DAL dal = new DAL();
string upt = string.Format("UPDATE [MailConfig] SET Server='{0}', Username='{1}', Password='{2}', AddressFrom='{3}', DisplayName='{4}'",server.Text,username.Text,password.Text,replyto.Text,displayname.Text);
dal.UpdateRow(upt,false,null);
LoadData();
}

мир!

Ответы [ 8 ]

3 голосов
/ 16 декабря 2008

Попытка обернуть имена ваших полей в []. В прошлом у меня были проблемы с определенными именами полей, такими как имя пользователя, пароль, количество и т. Д., Которые были распознаны как зарезервированные слова и испортили sql, что выдает ошибку.

0 голосов
/ 16 декабря 2008

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

0 голосов
/ 16 декабря 2008

Это небольшое приложение asp.net для знакомого, которого я знаю .. этот чувак собирается отправлять почтовые сообщения, и это всего лишь экран для него, чтобы определить свой почтовый сервер, пользователя и пароль, чтобы он мог отправлять электронные письма вокруг ... есть только одна строка, так что нет необходимости в операторе where .. Я все равно добавлю его ради "лучших практик" :) Да, в доступе нет ничего от StoredProcedure, но, надеюсь, клаузула santa приведет LINQ к OleDB в 2009 :) Так что этот запрос работает нормально, он обновляет строку, но только C # продолжает давать мне это исключение ... Я не знаю, почему на самом деле .. без понятия

0 голосов
/ 16 декабря 2008

Нет, мой метод Update принимает 3 параметра, таких как строка Query, boll IsSp, params OleDBParameter [] .. и я обычно делаю это простым способом, передавая false для sp, поэтому он не попадает в if (isSP) {cmd. CommandType = storeproc и т.д ..} .. это не делает этого .. есть также нулевая проверка для сбора параметров ... поэтому я посылаю ноль, когда мне лень, поэтому он также проходит, что принимает только запрос .. :) гений право

0 голосов
/ 16 декабря 2008

Вы используете CommandType StoredProcedure, но ваш запрос не является именем хранимой процедуры, это SQL-запрос без предложения where.

UPDATE [MailConfig] 
SET Server='{0}', 
    Username='{1}', 
    Password='{2}', 
    AddressFrom='{3}', 
    DisplayName='{4}'"

Таким образом, вам нужно удалить строку типа команды или изменить ее на правильный тип команды CommandType.Text и добавить предложение Where, указывающее, на какие строки следует воздействовать.

Я не думаю, что в Access даже есть хранимые процедуры, поэтому использовать этот тип команды с ним бесполезно.

Примером команды, которая использует хранимые процедуры, будет что-то вроде:

string sqlCommString = "QCApp.dbo.ColumnSeek";
SqlCommand metaDataComm = new SqlCommand(sqlCommString, sqlConn);
metaDataComm.CommandType = CommandType.StoredProcedure;

Строка команды для этого типа - это просто имя сохраненного процесса.

0 голосов
/ 16 декабря 2008

Я знаю, что в этой таблице есть только одна строка ... просто имя пользователя, пароль и т. Д. ... Я также добавил, где оператор без изменений ...

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

Что касается деталей моего исключения, то, как вы видите, есть два блока catch, и последний перехватывает его ... Исключение ... не OleDBException ... и он говорит только о синтаксической ошибке в выражении UPDATE. Вот и все ... Пока я отлаживаюсь, получаю SQL-оператор из Visual Studio, вставляю в Access, и он отлично работает

0 голосов
/ 16 декабря 2008

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

Во-вторых, выполнение такого кода делает вас очень уязвимыми для SQL-инъекций, если кто-то введет имя пользователя, в которое встроена команда sql, вы можете потерять все свои данные.

Вы должны использовать параметризованные запросы. Вы указываете свои параметры в команде sql с помощью @paramname вместо использования {4}, а затем с помощью объекта команды выполните accessCommand.parameters.AddWithValue ("@ paramname", value)

0 голосов
/ 16 декабря 2008

Прежде всего - не используйте string.Format здесь. Используйте параметры и добавьте параметры в команду. Прямо сейчас вы широко открыты для атак с использованием SQL-инъекций. Подумайте " Бобби Таблицы ".

Повторно "заявив, что мой синтаксис SQL неверен", не могли бы вы процитировать точную ошибку?

...