2012-12-19 14 views
12

Sto tentando di aggiornare un DataTable che viene recuperato da un DB prima di collegarlo a Gridview.DataRow sta azzerando la parte decimale di un decimale quando si aggiorna Datatable

Tuttavia, quando aggiorno i campi decimali, la parte dopo il punto decimale viene azzerata. Cosa mi manca?

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

devo PX uscita e Cash prima della cessione e tengono i valori corretti di 800,19 e 500,12, ma dopo i AcceptChanges e una volta che sono legati, l'uscita è 800,00 e 500,12.

theRows[0]["stockitem_pxprice"] & theRows[0]["stockitem_cashprice"] sono entrambi decimal(5,2) sul DB dove il searchResultsDT è popolato da.

Qualsiasi aiuto molto apprezzato.

Grazie.

+2

Quali sono i valori intermedi di 'px' e' cash' dopo la chiamata 'Convert.ToDecimal()'? Guarderei alla possibilità di un problema culturale, qui, ma il fatto che uno funzioni correttamente e l'altro non sembra davvero strano. –

+3

Dichiarate la struttura (schema) di 'searchResults' prima di caricarla da' SqlReader'? Forse il tuo 'stockitem_pxprice' è dichiarato come' typeof (int) '? –

+0

Verificare la dichiarazione/definizione dei risultati ricerca dati. Potrebbe esserci un qualche tipo di disallineamento –

risposta

0

penso che il vostro tavolo ha sotto i due campi come tipo di dati int:

  • stockitem_pxprice

  • stockitem_cashprice

modificare la tabella con i tipi di dati come numeric (18,2) per questi due campi

o

modificare la vostra tavola con il tipo di dati come [decimal](18, 2) per questi due campi

senza bisogno di fusione di caratteri, asp.net lo farà implicitamente

+0

I campi nella tabella sono decimali (5,2) –

+0

Ho scritto codice al mio fianco, ha funzionato correttamente. – Sanjay

0

Foreach sul theRows.Columns e scaricare la proprietà .Type a traccia. Hai menzionato più volte che il tipo è decimale (5,2) che è un tipo TSQL. Il DataTable contiene i tipi C#, che è decimale e che è come un float molto grande. È il tipo C# che conta qui.

Potrebbe essersi verificata una conversione nel proprio tsql, ad es. Select myVal * 1 che trasforma il tuo decimale myVal in un int. Questo sarà il tipo di dati che possiedi. Di solito imposto le mie costanti su qualcosa come myVal *1.0 per impedire che i valori si trasformino in ints. Proprio come come si deve dichiarare un numero decimale in C#, come 100 metri, in TSQL è necessario assicurarsi che letterali sono dichiarati appositamente per evitare che tipo di dati conversioni

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

1

Si trovi il string.format durante l'impostazione del valore nella rete . È necessario formattare il doppio prima di impostarlo.

Supponiamo che se si ottiene un numero come 4.506 verrà visualizzato qualcosa come 4.5060 o se si dispone di un numero come 4.5, quindi verrà visualizzato come 4.50.

Ho affrontato questo problema in gridview con modelli e ho dovuto usare string.format e specificatore di formato per risolverlo.

0

non sono sicuro se hai ancora una risposta, ma vorrei condividere che potrei risolto questo utilizzando il metodo di SqlDataReader, è GetDecimal metodo. Si potrebbe codice come questo

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

Dove pcReader.GetDecimal (0) significa ottenere campo dati indice 0 come valore decimale dal set di risultati, è un ordine delle colonne selezionate nel comando SELECT. E la stored procedure getAllMyPriceMatches, è possibile modificare lo script della query utilizzando il comando JOIN, tra due risultati di tabella, quindi non è necessario disporre del secondo ambito di query.