Проблемы при вставке значений из текстовых полей - PullRequest
0 голосов
/ 28 апреля 2010

Я пытаюсь вставить текущую дату в базу данных и всегда получаю сообщение (когда я нажимаю кнопку в форме для сохранения в моей базе данных доступа), что тип данных неверен в условном выражении. код:

string conString = "Provider=Microsoft.Jet.OLEDB.4.0;"
         + "Data Source=C:\\Users\\Simon\\Desktop\\save.mdb";

            OleDbConnection empConnection = new OleDbConnection(conString);


            string insertStatement = "INSERT INTO obroki_save "
                                 + "([ID_uporabnika],[ID_zivila],[skupaj_kalorij]) "
                                 + "VALUES (@ID_uporabnika,@ID_zivila,@skupaj_kalorij)";

            OleDbCommand insertCommand = new OleDbCommand(insertStatement, empConnection);

            insertCommand.Parameters.Add("@ID_uporabnika", OleDbType.Char).Value = users.iDTextBox.Text;
                            insertCommand.Parameters.Add("@ID_zivila", OleDbType.Char).Value = iDTextBox.Text;
            insertCommand.Parameters.Add("@skupaj_kalorij", OleDbType.Char).Value = textBox1.Text;
            empConnection.Open();

            try
            {
               int count = insertCommand.ExecuteNonQuery();
            }
            catch (OleDbException ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                empConnection.Close();
                textBox1.Clear();
                textBox2.Clear();
                textBox3.Clear();
                textBox4.Clear();
                textBox5.Clear();
            }

Я вырезал дату (я сделал доступ вставить дату), но проблема все та же. Первая строка в порядке? users.idtextbox.text? Пожалуйста, помогите!

Ответы [ 6 ]

2 голосов
/ 28 апреля 2010

попробуйте изменить

insertCommand.Parameters.Add("@datum", OleDbType.Char).Value = DateTime.Now;

на

 `insertCommand.Parameters.Add("@datum", OleDbType.Char).Value 
      = DateTime.Now.ToString("dd MMM yyyy HH:mm");`

(или другой приемлемый формат даты)

0 голосов
/ 28 апреля 2010

Вы уверены, что проблема в значении даты?Т.е. другие столбцы действительно имеют тип Char?Для значений даты вы должны использовать OleDbType.DBDate, но вы должны также использовать соответствующий тип для других столбцов.

EDIT Протестировано в базе данных Access со столбцом даты, сработало следующее (хотя время явно сократилось):

cmd.Parameters.Add( "@DateColumn", OleDbType.DBDate ).Value = DateTime.Now;

А также (включая время)

cmd.Parameters.Add( "@TestDate", OleDbType.Date ).Value = DateTime.Now;

РЕДАКТИРОВАТЬ Как и в случае параметров даты, вы должны бытьпередача определенных типов для других значений:

insertCommand.Parameters.Add("@ID_uporabnika", OleDbType.Integer).Value = int.Parse( users.iDTextBox.Text );
insertCommand.Parameters.Add("@ID_zivila", OleDbType.Integer.Value = int.Parse( iDTextBox.Text );
insertCommand.Parameters.Add("@skupaj_kalorij", OleDbType.Integer).Value = int.Parse( textBox1.Text );
0 голосов
/ 28 апреля 2010

Вы можете упростить использование OleDb, добавив такие параметры:

OleDbParameter param = new OleDbParameter("@datum", DateTime.Now);
command.Parameters.Add(param);

При этом используется переопределение OleDbParameter, которое принимает строку (имя параметра) и объект (независимо от значения, которое должнобыть для параметра). Это позволяет OleDb определить правильный тип параметра для вас (и сэкономит вам много времени при наборе и изменении типов параметров).

Обновление: только что заметил, что этоJet.Когда дело касается Access, все ставки выключены, поэтому я ни в коем случае не уверен, что вышесказанное сработает.

0 голосов
/ 28 апреля 2010

Я думаю, что вы получаете проблему из-за формата даты, установленного в ваших региональных настройках, и формата даты, принятого MS Access.

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

 DateTimeFormatInfo ukDTFomat = new CultureInfo("en-GB", false).DateTimeFormat;
 DateTime.Now.ToString("yyyy-MM-dd", ukDTFomat);
0 голосов
/ 28 апреля 2010

Вы должны использовать тип OleDbType.Date в параметре. Это соответствует значению DateTime в .NET и дате OLE (внутренне представленной как double) в базе данных. Это то, что Access использует для хранения дат.

При использовании любого другого формата даты в OleDbType он будет преобразован в строковое представление, которое Access не распознает как дату.

Если вы используете OleDbType.Char, значение DateTime будет преобразовано в строку с использованием текущей культуры в .NET, которая может быть или не быть понятой Access в зависимости от того, какая культура используется. В вашем случае кажется, что это не поняли.

0 голосов
/ 28 апреля 2010

Предполагая, что ваша база данных фактически содержит даты, а не строки, для столбца даты - я думаю, вы пытаетесь вставить значения char в столбец даты.

Изменение

insertCommand.Parameters.Add("@datum", OleDbType.Char).Value = DateTime.Now;

до

insertCommand.Parameters.Add("@datum", OleDbType.Date).Value = DateTime.Now;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...