2012-12-19 11 views
12

Ich versuche, eine DataTable zu aktualisieren, die von einem DB abgerufen wird, bevor es an eine Gridview gebunden wird.DataRow setzt den Dezimalteil einer Dezimalstelle beim Aktualisieren von Datatable auf

Wenn ich jedoch Dezimalfelder aktualisiere, wird der Teil nach dem Dezimalpunkt auf Null gesetzt. Was vermisse ich?

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

Ich habe Ausgabe PX und Bargeld vor der Zuweisung und sie halten die richtigen Werte von 800,19 und 500,12, aber nach dem AcceptChanges und sobald sie gebunden sind, ist der Ausgang 800,00 und 500,12.

theRows[0]["stockitem_pxprice"] & theRows[0]["stockitem_cashprice"] sind beide decimal(5,2) auf der DB, wo die searchResultsDT von bevölkert ist.

Jede Hilfe sehr geschätzt.

Danke.

+2

Was sind die Zwischenwerte von 'px' und' cash' nach dem 'Convert.ToDecimal()' Aufruf? Ich würde hier auf die Möglichkeit eines Kulturproblems schauen, aber die Tatsache, dass eines richtig funktioniert und das andere nicht sonderlich merkwürdig erscheint. –

+3

Deklarieren Sie die Struktur (Schema) der 'searchResults', bevor Sie sie vom' SqlReader' laden? Vielleicht wird Ihr 'stockitem_pxprice' als' typeof (int) 'deklariert? –

+0

Überprüfen Sie die Deklaration/Definition von Datatable searchResults. Es kann einen Typ geben, der nicht passt –

Antwort

0

Ich denke, Ihre folgende Tabelle zwei Felder als int-Datentyp hat:

  • stockitem_pxprice

  • stockitem_cashprice

Ihre Tabelle mit Datentyp als numeric (18,2) für diese beiden Felder ändern

oder

ändern Sie Ihre Tabelle mit Datentyp als [decimal](18, 2) für diese beiden Felder

keine Notwendigkeit der Schublade gesteckt, wird es asp.net tun implizit

+0

Die Felder in der Tabelle sind dezimal (5,2) –

+0

Ich schrieb Code an meiner Seite, es hat gut funktioniert. – Sanjay

0

Foreach über die theRows.Columns und werfen den .Type Eigenschaft Spur. Sie haben mehrfach erwähnt, dass der Typ dezimal (5,2) ist, der ein TSQL-Typ ist. Die DataTable enthält C# -Typen, die dezimal sind und das ist wie ein sehr großer Float. Es ist der C# -Typ, der hier zählt.

Möglicherweise wurde in Ihrem tsql eine Konvertierung durchgeführt, z. Select myVal * 1, die Ihre myVal-Dezimalstelle in ein int verwandelt. Das ist dann der Typ, den Ihre Datentabelle enthält. Normalerweise setze ich meine Konstanten auf etwas wie myVal *1.0, um zu verhindern, dass Werte zu Ints werden. Genau wie wie muss man wie 100m eine Dezimalzahl in C# erklären, in TSQL müssen Sie sicher, dass Literale speziell deklariert machen werden, um Datentypkonvertierungen zu verhindern

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

1

Ja Sie string.format fehlen, während Wert in Gittereinstellung . Sie müssen Double vor der Einstellung formatieren.

Sagen Sie, wenn Sie eine Zahl wie 4.506 erhalten, wird etwas wie 4.5060 angezeigt, oder wenn Sie eine Zahl wie 4.5 haben, wird es als 4.50 angezeigt.

Ich habe dieses Problem in Templated Gridview konfrontiert und musste string.format und Formatbezeichner verwenden, um es zu lösen.

0

Ich bin nicht sicher, ob Sie eine Antwort noch haben, aber ich würde teilen, dass ich dies mit der Methode von SqlDataReader fixierte könnte, dann ist es GetDecimal Methode. Sie könnten wie kodieren diese

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

Wo pcReader.GetDecimal (0) bei Index 0 als Dezimal-Wert aus der Ergebnismenge erhält Datenfeld bedeuten, es ist eine Reihenfolge der ausgewählten Spalten in SELECT-Befehl. Und die gespeicherte Prozedur getAllMyPriceMatches, können Sie das Abfrageskript mit dem Befehl JOIN zwischen zwei Tabellenergebnisse ändern, dann müssen Sie nicht den zweiten Abfragebereich haben.

Verwandte Themen