База данных говорит, что это вставка, но нет записей - PullRequest
0 голосов
/ 29 августа 2011

Я отправляю команду в базу данных, и она возвращает, что затрагиваются 1 строки, но когда я заглядываю внутрь базы данных, записей нетЯ не получаю ошибок.Я проверил, чтобы убедиться, что строка строит правильно, и это так.Есть идеи?Я не использую параметризованные запросы здесь, я знаю.Я буду позже.Вот код из уровня базы данных:

public int InsertStartTime(certificate cert, DateTime startTime, string lineNumber)
        {
            string sql = "INSERT INTO checkLog(userID,lineNumber,startTime) VALUES(" +
                         cert.userID + ", '" + lineNumber + "', '" + startTime + "');";
            int result = 0;

            try
            {
                conn.Open();
                comm.CommandText = sql;
                result = comm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                conn.Close();
            }

            MessageBox.Show(result.ToString() + " rows affected");
            return result;
        }

Использование файла доступа 2000 дБ:

string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\assets\users.mdb;Persist Security Info=True";

Ответы [ 3 ]

5 голосов
/ 29 августа 2011

Щелкните правой кнопкой мыши файл вашей базы данных в VS и посмотрите на свойства.Установлено ли «Копировать всегда»?По умолчанию Visual Studio сделает копию вашей базы данных для отладки, и любые изменения будут внесены только в эту копию и не будут отражены в оригинале.Вы можете настроить его на «Никогда», если хотите работать с «настоящим» файлом базы данных даже в режиме отладки.

1 голос
/ 29 августа 2011

Никто другой не указал на это, так что я буду.ПОЖАЛУЙСТА, НЕ ИСПОЛЬЗУЙТЕ SQL таким образом.Используйте параметры.В противном случае вы оставляете себя широко открытыми для атак SQL.

  string sql = "INSERT INTO checkLog(userID,lineNumber,startTime) VALUES(@ID, @line, @starttime);
        try
        {
            conn.Open();
            comm.CommandText = sql;
            comm.Parameters.Add("ID").Value = cert.userID;
            comm.Parameters.Add("line").Value = lineNumber ;
            comm.Parameters.Add("starttime").Value = startTime ;
            result = comm.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
1 голос
/ 29 августа 2011

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

Попробуйте совершить транзакцию явно. Примерно так:

conn.Open();
using (var tran = conn.BeginTransaction()) {
    comm.Transaction = tran; // Possibly redundant, depending on database.
    comm.CommandText = sql;
    result = comm.ExecuteNonQuery();
    tran.Commit();
}
...