[研究]ASP.NET,WebForm,e.NewValues存入 DB 的 float 欄位後可能變了(二)
2025-04-29
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19
********************************************************************************
續
[研究]ASP.NET,WebForm,e.NewValues存入 DB 的 float 欄位後可能變了(一)
https://shaurong.blogspot.com/2025/04/aspnetwebformenewvalues-db-float.html
********************************************************************************
擷取發生狀況的程式中的相關部分,寫了程式測試
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default1.aspx.cs"
Inherits="WebApplication1.Default1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:MyDBConnectionString %>"
DeleteCommand="DELETE FROM [Table58] WHERE [SN] = @SN"
InsertCommand="INSERT INTO [Table58] ([floatField], [decimalField], [realField], [numericField])
VALUES (@floatField, @decimalField, @realField, @numericField)"
SelectCommand="SELECT * FROM [Table58]"
UpdateCommand="UPDATE [Table58] SET [floatField] = @floatField, [decimalField] = @decimalField,
[realField] = @realField, [numericField] = @numericField WHERE [SN] = @SN">
<DeleteParameters>
<asp:Parameter Name="SN" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="floatField" Type="Double" />
<asp:Parameter Name="decimalField" Type="Decimal" />
<asp:Parameter Name="realField" Type="Single" />
<asp:Parameter Name="numericField" Type="Decimal" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="floatField" Type="Double" />
<asp:Parameter Name="decimalField" Type="Decimal" />
<asp:Parameter Name="realField" Type="Single" />
<asp:Parameter Name="numericField" Type="Decimal" />
<asp:Parameter Name="SN" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
<asp:GridView ID="GridView1" runat="server" AllowPaging="False" AllowSorting="True" AutoGenerateColumns="False"
EmptyDataText="無資料" DataKeyNames="SN" DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="SN" HeaderText="SN" InsertVisible="False" ReadOnly="True" SortExpression="SN" />
<asp:BoundField DataField="floatField" HeaderText="floatField" SortExpression="floatField" />
<asp:BoundField DataField="decimalField" HeaderText="decimalField" SortExpression="decimalField" />
<asp:BoundField DataField="realField" HeaderText="realField" SortExpression="realField" />
<asp:BoundField DataField="numericField" HeaderText="numericField" SortExpression="numericField" />
</Columns>
</asp:GridView>
<br />
<asp:DetailsView ID="DetailsView1" DefaultMode="Edit" runat="server"
Height="50px" Width="600px" AutoGenerateRows="False" DataKeyNames="SN" DataSourceID="SqlDataSource1"
OnItemInserted="DetailsView1_ItemInserted"
OnItemInserting="DetailsView1_ItemInserting" AllowPaging="True" OnItemUpdating="DetailsView1_ItemUpdating">
<Fields>
<asp:BoundField DataField="SN" HeaderText="SN" InsertVisible="False" ReadOnly="True" SortExpression="SN" />
<asp:TemplateField HeaderText="floatField" SortExpression="floatField">
<InsertItemTemplate>
<asp:TextBox ID="TextBox_floatField" runat="server" Text='<%# Bind("floatField") %>'></asp:TextBox>
</InsertItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox_floatField" runat="server" Text='<%# Bind("floatField") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("floatField") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="decimalField" SortExpression="decimalField">
<InsertItemTemplate>
<asp:TextBox ID="TextBox_decimalField" runat="server" Text='<%# Bind("decimalField") %>'></asp:TextBox>
</InsertItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox_decimalField" runat="server" Text='<%# Bind("decimalField") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("decimalField") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="realField" SortExpression="realField">
<InsertItemTemplate>
<asp:TextBox ID="TextBox_realField" runat="server" Text='<%# Bind("realField") %>'></asp:TextBox>
</InsertItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox_realField" runat="server" Text='<%# Bind("realField") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("realField") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="numericField" SortExpression="numericField">
<InsertItemTemplate>
<asp:TextBox ID="TextBox_numericField" runat="server" Text='<%# Bind("numericField") %>'></asp:TextBox>
</InsertItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox_numericField" runat="server" Text='<%# Bind("numericField") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("numericField") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowInsertButton="True" ShowDeleteButton="True" ShowEditButton="True" />
</Fields>
</asp:DetailsView>
<asp:Button ID="Button1" runat="server" Text="新增10筆" OnClick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="更新10筆" OnClick="Button2_Click" />
</form>
</body>
</html>
|
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class Default1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void DetailsView1_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
{
GridView1.DataBind();
}
protected void DetailsView1_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
string floatField = e.Values["floatField"].ToString().Trim();
Int32.TryParse(floatField, out int floatFieldInt);
e.Values["floatField"] = floatFieldInt / 100.0;
string decimalField = e.Values["decimalField"].ToString().Trim();
Int32.TryParse(decimalField, out int decimalFieldInt);
e.Values["decimalField"] = decimalFieldInt / 100.0;
string realField = e.Values["realField"].ToString().Trim();
Int32.TryParse(realField, out int realFieldInt);
e.Values["realField"] = realFieldInt / 100.0;
string numericField = e.Values["numericField"].ToString().Trim();
Int32.TryParse(numericField, out int numericFieldInt);
e.Values["numericField"] = numericFieldInt / 100.0;
}
protected void Button1_Click(object sender, EventArgs e)
{
DetailsView1.ChangeMode(DetailsViewMode.Insert);
TextBox TextBox_floatField = null;
foreach (DetailsViewRow row in DetailsView1.Rows)
{
TextBox_floatField = row.FindControl("TextBox_floatField") as TextBox;
if (TextBox_floatField != null)
{
break; // 找到就跳出
}
}
TextBox TextBox_decimalField = null;
foreach (DetailsViewRow row in DetailsView1.Rows)
{
TextBox_decimalField = row.FindControl("TextBox_decimalField") as TextBox;
if (TextBox_decimalField != null)
{
break; // 找到就跳出
}
}
TextBox TextBox_realField = null;
foreach (DetailsViewRow row in DetailsView1.Rows)
{
TextBox_realField = row.FindControl("TextBox_realField") as TextBox;
if (TextBox_realField != null)
{
break; // 找到就跳出
}
}
TextBox TextBox_numericField = null;
foreach (DetailsViewRow row in DetailsView1.Rows)
{
TextBox_numericField = row.FindControl("TextBox_numericField") as TextBox;
if (TextBox_numericField != null)
{
break; // 找到就跳出
}
}
for (int i = 50; i <= 60; i++)
{
TextBox_floatField.Text = i.ToString();
TextBox_decimalField.Text = i.ToString();
TextBox_realField.Text = i.ToString();
TextBox_numericField.Text = i.ToString();
DetailsView1.ChangeMode(DetailsViewMode.Insert);
DetailsView1.InsertItem(true);
}
}
protected void Button2_Click(object sender, EventArgs e)
{
DetailsView1.ChangeMode(DetailsViewMode.Edit);
TextBox TextBox_floatField = null;
foreach (DetailsViewRow row in DetailsView1.Rows)
{
TextBox_floatField = row.FindControl("TextBox_floatField") as TextBox;
if (TextBox_floatField != null)
{
break; // 找到就跳出
}
}
TextBox TextBox_decimalField = null;
foreach (DetailsViewRow row in DetailsView1.Rows)
{
TextBox_decimalField = row.FindControl("TextBox_decimalField") as TextBox;
if (TextBox_decimalField != null)
{
break; // 找到就跳出
}
}
TextBox TextBox_realField = null;
foreach (DetailsViewRow row in DetailsView1.Rows)
{
TextBox_realField = row.FindControl("TextBox_realField") as TextBox;
if (TextBox_realField != null)
{
break; // 找到就跳出
}
}
TextBox TextBox_numericField = null;
foreach (DetailsViewRow row in DetailsView1.Rows)
{
TextBox_numericField = row.FindControl("TextBox_numericField") as TextBox;
if (TextBox_numericField != null)
{
break; // 找到就跳出
}
}
for (int i = 60; i <= 70; i++)
{
TextBox_floatField.Text = i.ToString();
TextBox_decimalField.Text = i.ToString();
TextBox_realField.Text = i.ToString();
TextBox_numericField.Text = i.ToString();
DetailsView1.UpdateItem(true);
}
}
protected void DetailsView1_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
{
string floatField = e.NewValues["floatField"].ToString().Trim();
Int32.TryParse(floatField, out int floatFieldInt);
e.NewValues["floatField"] = floatFieldInt / 100.0;
string decimalField = e.NewValues["decimalField"].ToString().Trim();
Int32.TryParse(decimalField, out int decimalFieldInt);
e.NewValues["decimalField"] = decimalFieldInt / 100.0;
string realField = e.NewValues["realField"].ToString().Trim();
Int32.TryParse(realField, out int realFieldInt);
e.NewValues["realField"] = realFieldInt / 100.0;
string numericField = e.NewValues["numericField"].ToString().Trim();
Int32.TryParse(numericField, out int numericFieldInt);
e.NewValues["numericField"] = numericFieldInt / 100.0;
}
}
}
|
SSMS 中刪除資料表內容使用
TRUNCATE TABLE [MyDB].[dbo].[Table58];
DBCC CHECKIDENT ("Table58", RESEED, 1);
|
下圖,
測試數次,無法重現問題,還有非預期的因素影響了,可能先不管了,要找時間改 DB Schema 和 ASP.NET 程式。(完)
相關


沒有留言:
張貼留言