2012-12-19 24 views
12

Próbuję zaktualizować DataTable, która jest pobierana z DB przed powiązaniem go z Gridview.DataRow zeruje dziesiętną część dziesiętnej przy aktualizacji Datatable

Jednak po zaktualizowaniu pól dziesiętnych część po przecinku dziesiętnym jest zerowana. czego mi brakuje?

if (HttpContext.Current.Request.IsAuthenticated) 
{ 
    // Get additional price matches 
    using (SqlConnection stockConn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString)) 
    { 
     // Check for trade match offer 
     SqlCommand tradePCCheck = new SqlCommand("getAllMyPriceMatches", stockConn); 
     tradePCCheck.CommandType = CommandType.StoredProcedure; 
     SqlParameter email = tradePCCheck.Parameters.Add("@email", SqlDbType.NVarChar); 
     try 
     { 
      email.Value = this.Context.User.Identity.Name; 
     } 
     catch 
     { 
      email.Value = " "; 
     } 
     SqlParameter thedate = tradePCCheck.Parameters.Add("@theDate", SqlDbType.DateTime); 
     thedate.Value = DateTime.Now.AddHours(-50); 

     stockConn.Open(); 
     SqlDataReader pcReader = tradePCCheck.ExecuteReader(); 
     pms.Load(pcReader); 
     pcReader.Close(); 
     stockConn.Close(); 
    } 
} 

//Set Connection, Open the DB & Fill Data Set 

using (SqlConnection stockConn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString)) 
{ 
    SqlCommand stockCommand = new SqlCommand("getTISearchResults", stockConn); 
    stockCommand.CommandType = CommandType.StoredProcedure; 
    SqlParameter keyword = stockCommand.Parameters.Add("@keyword", SqlDbType.NVarChar); 
    keyword.Value = prefixText; 
    stockConn.Open(); 
    SqlDataReader rd = stockCommand.ExecuteReader(); 
    searchResults.Load(rd); 
    stockCommand.Dispose(); 
    rd.Dispose(); 
} 

// Update Results with elevated prices... 
foreach (DataRow dr in searchResults.Rows) 
{ 
    // Check for PMS 
    DataRow[] thePMS = pms.Select("tpc_stockid = '" + dr["stockitem_number"].ToString() + "'"); 

    if (thePMS.Length > 0) 
    { 
     decimal px = 0; 
     decimal cash = 0; 

     if (thePMS[0]["tpc_pricepx"] != null && !thePMS[0]["tpc_pricepx"].ToString().Equals("")) 
     { 
      px = Convert.ToDecimal(thePMS[0]["tpc_pricepx"]); 
     } 

     if (thePMS[0]["tpc_price"] != null && !thePMS[0]["tpc_price"].ToString().Equals("")) 
     { 
      cash = Convert.ToDecimal(thePMS[0]["tpc_price"]); 
     } 
     // update table and accept changes 
     DataRow[] theRows = searchResults.Select("stockitem_number = '" + dr["stockitem_number"].ToString() + "' "); 

     if (theRows.Length > 0) 
     { 
      theRows[0]["stockitem_pxprice"] = px; 
      theRows[0]["stockitem_cashprice"] = cash; 
      searchResults.AcceptChanges(); 
     } 
    } 
} 

gvSearchResults.DataSource = searchResults; 
gvSearchResults.DataBind(); 

mam PX wyjściowego i Cash przed przypisaniem i posiadają odpowiednie wartości 800.19 i 500.12, ale po AcceptChanges i raz są one związane, wyjście jest 800,00 i 500,12.

theRows[0]["stockitem_pxprice"] & theRows[0]["stockitem_cashprice"] są oba decimal(5,2) na DB, z którego jest wypełniany searchResultsDT.

Każda pomoc bardzo ceniona.

Dzięki.

+2

Jakie są pośrednie wartości 'px' i' gotówka' po wywołaniu 'Convert.ToDecimal()'? Spoglądałbym na możliwość wystąpienia problemu kulturowego, ale fakt, że jeden działa prawidłowo, a drugi nie wydaje się naprawdę dziwny. –

+3

Czy deklarujesz strukturę (schemat) 'searchResults' przed załadowaniem go z' SqlReader'? Może twoja 'stockitem_pxprice' jest zadeklarowana jako' typeof (int) '? –

+0

Sprawdź deklarację/definicję datowalnych wyników wyszukiwania. Może występować niedopasowanie typów. –

Odpowiedz

0

Myślę, że tabela ma poniżej dwóch dziedzinach jak typ danych int:

  • stockitem_pxprice

  • stockitem_cashprice

zmodyfikować tabelę z typem danych jako numeric (18,2) dla tych dwóch dziedzinach

lub

zmodyfikować tabelę z typem danych jako [decimal](18, 2) dla tych dwóch pól

nie potrzeba rzutowania, asp.net zrobi to pośrednio

+0

Pola w tabeli są dziesiętne (5,2) –

+0

napisałem kod u mojej strony, działało dobrze. – Sanjay

0

Foreach nad theRows.Columns i zrzucić .typ do własności ślad. Kilka razy wspomniałeś, że typ to dziesiętny (5,2), który jest typem TSQL. DataTable zawiera C# typy, które są dziesiętne i to jest jak bardzo duży float. Tutaj liczy się typ C#.

Możliwe, że w tsql była konwersja, np. Select myVal * 1, która zamienia twój dziesiętny myVal na int. To będzie typ, który przechowujesz. Zazwyczaj ustawiam moje stałe na coś takiego, jak myVal *1.0, aby zapobiec przekształcaniu wartości w ints. Podobnie jak w jaki sposób trzeba zadeklarować po przecinku w C# jak 100m, w TSQL trzeba upewnić się, że literały są uznane za specjalnie, aby zapobiec konwersji typów danych

Ref http://msdn.microsoft.com/en-us/library/ms179899.aspx

1

Tak brakuje string.format podczas ustawiania wartości do siatki . Zanim ją ustawisz, musisz sformatować dwukrotnie.

Powiedzmy, że jeśli otrzymasz numer 4,506, wyświetli się około 4.5060 lub jeśli masz numer jak 4,5, to wyświetli się jako 4,50.

Mam do czynienia z tym problemem w szablonie gridview i musiałem użyć string.format i specyfikatora formatu, aby go rozwiązać.

0

Nie jestem pewien, czy masz jeszcze odpowiedzi, ale chciałbym podzielić się, że mogę to ustalone za pomocą metody SqlDataReader, to GetDecimal metoda. można zakodować tak

using (SqlConnection stockConn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString)) 
{ 
     // Check for trade match offer 
     SqlCommand tradePCCheck = new SqlCommand("getAllMyPriceMatches", stockConn); 
     tradePCCheck.CommandType = CommandType.StoredProcedure; 
     SqlParameter email = tradePCCheck.Parameters.Add("@email", SqlDbType.NVarChar); 
     try 
     { 
      email.Value = this.Context.User.Identity.Name; 
     } 
     catch 
     { 
      email.Value = " "; 
     } 
     SqlParameter thedate = tradePCCheck.Parameters.Add("@theDate", SqlDbType.DateTime); 
     thedate.Value = DateTime.Now.AddHours(-50); 

     stockConn.Open(); 

    SqlDataReader pcReader = tradePCCheck.ExecuteReader(); 

    decimal px = 0; 
    decimal cash = 0; 

    if (pcReader.Read()) 
    { 
     px = pcReader.GetDecimal(0); 
     cash = pcReader.GetDecimal(1); 
    } 
    pcReader.Close(); 
    stockConn.Close(); 
} 

Gdzie pcReader.GetDecimal (0) znaczy dostać pole danych o indeksie 0 jako wartość dziesiętną ze zbioru wynikowego, to rozkaz z wybranych kolumn w poleceniu SELECT. I procedura składowana getAllMyPriceMatches, można zmodyfikować skrypt kwerendy za pomocą polecenia DOŁĄCZ, między dwoma wynikami tabel, wtedy nie trzeba mieć drugi zakres zapytania.