2015-01-17 2 views
2

Краткая информация: Я заменяю устаревшую, основанную на Visual Basic программу на основе C#. С помощью программы вы получаете базу данных Access (JET), которая уже используется. На данный момент я хочу подключиться к текущей базе данных по практическим соображениям. Однако в обозримом будущем я хотел бы заменить его на SQL Server.Вставить десятичное значение в поле «Валюта»

Вопрос: База данных хранит финансовую информацию, используя тип данных «Валюта» доступа. В C# я использую «Decimal» для представления финансовой информации. Естественно, я получаю сообщение об ошибке при попытке запроса INSERT или UPDATE для сохранения десятичного разряда в поле Currency (фактически, я получаю сообщение об ошибке один раз и вместе с ним, он автоматически изменяет тип данных этой конкретной записи на десятичный). Я не уверен, что лучший способ решить эту проблему:

  1. Преобразование десятичной суммы в валюту в моей программе и вставка ее после. Возможно ли это (C# говорит, что значения из поля имеют тип DBNull, так как он не знает Currency)? Если да, то как мне это сделать?
  2. Измените тип данных поля на десятичный. Буду ли я подвергать коррупцию финансовой информации, когда я это делаю?
  3. Любые другие/лучшие предложения?

Заранее благодарен!


Точное сообщение об ошибке:

System.Data.Odbc.OdbcException (0x80131937): ERROR [07006] 
[Microsoft][ODBC Microsoft Access-stuurprogramma]Inbreuk op kenmerk van beperkt gegevenstype 

Это голландский и переводит Restricted data type attribute violation

Мой UPDATE Код:

public Boolean setFuelCosts(int rentID, Decimal fuelcosts) 
     { 
      string conString = lem2; 
      string queryString = "UPDATE rental SET fuel = ? WHERE rentid = ?"; 
      OdbcCommand command = new OdbcCommand(queryString); 
      command.Parameters.Add("@fuel", OdbcType.Decimal).Value = fuelcosts; 
      command.Parameters.Add("@rentid", OdbcType.Int).Value = rentID; 
      return factory.executeUpdateCommand(conString, command); 
     } 

public Boolean executeUpdateCommand(String conString, OdbcCommand command) 
     { 
      bool result = false; 
      using (OdbcConnection connection = new OdbcConnection(conString)) 
      { 
       try 
       { 
        command.Connection = connection; 
        command.CommandType = CommandType.Text; 
        connection.Open(); 
        int i = command.ExecuteNonQuery(); 
        result = (i >= 1); 
        connection.Close(); 
       } 
       catch (Exception exc) 
       { 
        System.Windows.Forms.MessageBox.Show(exc.Message); 
        System.Windows.Forms.MessageBox.Show(exc.StackTrace); 
       } 
      } 
      return result; 
     } 
+0

Пример вашего кода, в котором вы пытаетесь вставить значения и точное сообщение об ошибке, будет очень полезно здесь (версия для доступа?) – Steve

+0

Вы пытались отправить переменную как тип: OleDbType.Currency? – OmerBTW

+0

Я добавил код и сообщение об ошибке. Версия доступа - 97 (как я уже сказал, устарел). @ OmerBTW: Я использую Odbc, поэтому я боюсь, что это не сработает. – JeroenM

ответ

1

Ваш вопрос, как представляется, является ограничением доступа Драйвер ODBC при работе с полями Currency с использованием System.Data.Odbc в .NET. OdbcDataReader будет вернуть эти поля как System.Decimal (если значение не равно NULL), но System.Data.Odbc, по-видимому, не примет параметр System.Decimal для поля Currency.

В качестве временного решения можно заменить

command.Parameters.Add("@fuel", OdbcType.Decimal).Value = fuelcosts; 

с

command.Parameters.Add("@fuel", OdbcType.NVarChar).Value = fuelcosts.ToString("0.0000"); 

Я просто проверял это из C# 2010 от файла базы данных Access 2000 и он работал на меня.

+0

Это сработало, спасибо! Даже не нужна Инвариантная культура. – JeroenM

+0

Дальнейшее тестирование показало, что 'InvariantCulture' может привести к сбою обновления при некоторых обстоятельствах, поэтому я удалил его из ответа. –

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