2010-10-02 3 views
2

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

 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)); 
      } 

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

ответ

0

Похоже, выполнить запрос дважды (две области, в которых вы называете 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); 
+0

Он просто отображает сообщение, которое сообщает мне необработанное исключение приложением – peggalvan

+0

@Natalie. Если вы обновите свой исходный вопрос с текстом исключения, это может помочь. – Slartibartfast

+0

Я редактировал, кажется, что что-то не так в запросе, я полагаю – peggalvan

0

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

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

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

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

EDIT:

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

a. LINQ:

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

b. Образец репозитория:

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

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

EDIT ОБЕСПЕЧИТЬ SAMPLE LINQ TO 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

спасибо за предложение, я думаю, что мне нужно лучше понять все концепции, Я немного знаю Java – peggalvan

+0

Я думаю, что это более читаемо, мне нужно изучить Linq и использовать его в проекте, спасибо за ответ – peggalvan

+0

http://stackoverflow.com/questions/295772/query-microsoft-access-mdb-database -using-linq-and-c – awrigley

0

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

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

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

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

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

+0

спасибо за asnwering, но я добавляю параметры в правильном порядке, но ничего не происходит, когда я проверяю базу данных доступа, theres no change – peggalvan

+0

Вы использовали знак вопроса вместо имени параметра в командном тексте? – JeffO

Смежные вопросы