проблемы обновления базы данных Access из справки Textbox? - PullRequest
2 голосов
/ 02 октября 2010

Я искал, но ничего не происходит, я только начинаю использовать C # .NET, и у меня есть текстовое поле на форме.Я извлекаю некоторые данные из базы данных и отображаю их в текстовом поле через поле со списком, в котором указан раздел, который я хочу отобразить (я уже делаю это!), Но когда я пытаюсь обновить ничего, я нажимаю кнопку, чтобы обновить базу данных доступа(Access 2007) и ничего не происходит, пользователь просто что-то меняет и кнопка должна обновить базу данных acces, я надеюсь, вы можете мне помочь: D Это мой код до сих пор:

        String textTobeUpdated = textBox3.Text;
        String thing = comboBox2.Text;




        using (var conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MyDataBase.accdb"))

        using (var cmd = conn.CreateCommand())
        {


            cmd.CommandText = "UPDATE Section SET content = [@content] WHERE name= thing";
            cmd.Parameters.AddWithValue("@content",content);


            conn.Open();



            int rowsAffected = cmd.ExecuteNonQuery();
            if (rowsAffected == 1)
            {
                MessageBox.Show("Success");
            }
            else
            {
                MessageBox.Show(string.Format("{0} Rows Affected", rowsAffected));
            }

этот код отображаетсясообщение «Необработанное исключение. Если нажать« Продолжить », приложение пропустит эту ошибку и намерено продолжить. Если нажать« Выйти », приложение будет немедленно закрыто.« Для некоторых из обязательных параметров не указано значение.

Ответы [ 3 ]

0 голосов
/ 02 октября 2010

Если вы новичок в .NET и используете последнюю версию C #, то я бы порекомендовал вам написать свой код доступа к данным с помощью LINQ.

Вы должны изучить LINQ, но это гораздо более естественночем изучение ADO.NET.

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

Я думаю, что решение SlartibartfastЭто правильно, учитывая код, но я публикую это как ответ, а не комментарий, потому что использование LINQ является более легкой кривой обучения.Затем вы можете изучить ADO.NET, если вам нужно.

РЕДАКТИРОВАТЬ:

Я думаю, что биты C #, которые вам нужно прочитать, это LINQ, LINQ to SQL, LINQ to Entities, кака также шаблон репозитория для инкапсуляции кода доступа к данным.Ваш код выше написан с использованием ADO.NET, который является трудным, низкоуровневым способом сделать это.Я считаю, что если у вас нет множества унаследованного кода, тогда LINQ - это путь.

a.LINQ:

LINQ расшифровывается как интегрированный с языком запрос и позволяет вам запрашивать коллекцию объектов так же, как и базу данных.Но это также, в своих вариантах LINQ to SQL и LINQ to Entities, технология доступа к данным.Это позволяет запрашивать, создавать, редактировать и удалять данные в базе данных (или другом хранилище данных).Он «выглядит» как SQL, но имеет строгую типизацию.

b.Шаблон репозитория:

Шаблон репозитория - это шаблон, который позволяет стандартизировать (и тестировать, если так склонен) код доступа к данным, все они инкапсулированы в классе.Это делает ваш код НАМНОГО более понятным.

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

РЕДАКТИРОВАТЬ, ЧТОБЫ ОБЕСПЕЧИТЬ ОБРАЗЕЦ LINQ ДЛЯ SQL ВАРИАНТ:

Голые кости того, что вы хотите сделать, были бы примерно:

Предполагая, что вы создали файл DBML с именем dbDataContext, и запись, которую вы хотите обновить, находится в таблице с именем MyTable:

// instantiate the datacontext object using the connection string
var db = new dbDataContext("myConnectionString");

// retrieve the record to update
var record = (from r in db.Section where r.Name == "thing" select r).Single();

if (record != null) record.Content = "Content";

try
{
// try to update the database
db.SubmitChanges();
MessageBox.Show("Success!");
}
catch
{
// Darn!  Didn't work...
MessageBox.Show("Ooops!");
}

Обратите внимание, насколько это читабельно.

0 голосов
/ 03 октября 2010

Изменение: cmd.CommandText = "UPDATE Section SET content = [@content] WHERE name= thing";

На: cmd.CommandText = "UPDATE Section SET content = ? WHERE name= thing";

Через OleDB я не думаю, что вы можете присвоить параметру в тексте команды Jet / ACE.Если у вас есть более одного параметра, вам придется держать их в порядке и продолжать использовать '?'.

...Where [This] = ? AND [That] = ?;

Добавить параметры в правильном порядке.

0 голосов
/ 02 октября 2010

Похоже, что вы выполняете запрос дважды (две области, где вы вызываете cmd.ExecuteNonQuery();)

Удалите первую и оставьте строку, которая говорит

int rowsAffected = cmd.ExecuteNonQuery(); 

Эта строка будет выполнятьобновите, затем посчитайте, сколько строк было обновлено.Этот счетчик затем используется для отображения сообщения пользователю.

Вы также не устанавливаете переменную content со значением (я думаю, это должно быть значение текстового поля) и сам запрос на обновлениекажется немного странным, вы не параметризовали «вещь», которую вы обновляете, поэтому я думаю, это должно быть:

cmd.CommandText = "UPDATE Section SET content=[@content] WHERE name=[@thing]"; 
cmd.Parameters.AddWithValue("@content", textTobeUpdated);
cmd.Parameters.AddWithValue("@thing", thing);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...