如何从SQLite数据库中正确检索浮点型数据到C#文本框
看起来你遇到的问题是SQLite数据库中存储的浮点数值在查询后被截断成整数,已经确认不是文本框的问题,那咱们从几个方面排查和解决:
1. 先确认数据库字段类型是否正确
首先要排查的是你的ItemInformation表中Cost和Price字段的类型是否真的是REAL(SQLite的浮点类型)。如果字段被误定义为INTEGER,那存入145.55的时候就会被自动截断成145,后续查询自然只能拿到整数。
- 用SQLite可视化工具(比如DB Browser for SQLite)打开你的数据库,查看
ItemInformation表的结构,确认Cost和Price的类型是REAL。 - 如果字段类型是
INTEGER,你需要修改字段类型为REAL,然后重新插入正确的浮点数值。
2. 修改代码中的数值读取方式
即使数据库字段类型正确,直接用Rows[0]["Cost"].ToString()或者Convert.ToString()可能会因为DataRow的类型推断问题导致截断。我们需要先把值强制转换为浮点类型再格式化:
替换你代码中读取Cost和Price的行:
// 原来的代码 // txtPurchaseCost.Text = Convert.ToString(clsUtility.sqlDT.Rows[0]["Cost"]); // txtSalesPrice.Text = clsUtility.sqlDT.Rows[0]["Price"].ToString(); // 修改后的代码(保留两位小数,可根据需求调整格式) double cost = Convert.ToDouble(clsUtility.sqlDT.Rows[0]["Cost"]); txtPurchaseCost.Text = cost.ToString("0.00"); double price = Convert.ToDouble(clsUtility.sqlDT.Rows[0]["Price"]); txtSalesPrice.Text = price.ToString("0.00");
如果担心转换异常,可以用更安全的TryParse方式:
if (double.TryParse(clsUtility.sqlDT.Rows[0]["Cost"].ToString(), out double cost)) { txtPurchaseCost.Text = cost.ToString("0.00"); } else { txtPurchaseCost.Text = "0.00"; // 设置默认值或者提示错误 } if (double.TryParse(clsUtility.sqlDT.Rows[0]["Price"].ToString(), out double price)) { txtSalesPrice.Text = price.ToString("0.00"); } else { txtSalesPrice.Text = "0.00"; }
3. 可选:强制SQL查询返回浮点类型
如果上面的方法还是不行,可能是SQLiteDataAdapter在填充DataTable时错误推断了列类型。这时候可以修改查询语句,显式把字段转换为REAL类型:
// 替换原来的查询语句 clsUtility.ExecuteSQLQuery(@" SELECT ITEM_ID, ItemName, UnitOfMeasure, Batch, GROUP_ID, WarehouseID, Barcode, CAST(Cost AS REAL) AS Cost, CAST(Price AS REAL) AS Price, ReorderPoint, VAT_Applicable, Barcode_Applicable, PhotoFileName FROM ItemInformation WHERE ITEM_ID ='" + ITEM_ID + "' ");
(注意:这里为了简洁只列出了需要的字段,你可以根据实际需要调整)
额外提醒:解决SQL注入风险
顺便提一句,你当前的代码直接拼接SQL语句(比如WHERE ITEM_ID ='" + ITEM_ID + "')存在严重的SQL注入风险,建议改用参数化查询。可以修改clsUtility的ExecuteSQLQuery方法支持参数:
public static DataTable ExecuteSQLQuery(string SQLQuery, params SQLiteParameter[] parameters) { try { using (SQLiteConnection sqlCon = new SQLiteConnection(CnString)) { using (SQLiteDataAdapter sqlDA = new SQLiteDataAdapter(SQLQuery, sqlCon)) { if (parameters != null && parameters.Length > 0) { sqlDA.SelectCommand.Parameters.AddRange(parameters); } SQLiteCommandBuilder sqlCB = new SQLiteCommandBuilder(sqlDA); sqlDT.Reset(); sqlDA.Fill(sqlDT); } } } catch (Exception ex) { Properties.Settings.Default.App_Default_Conn = false; Properties.Settings.Default.Save(); MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } return sqlDT; }
调用的时候改成:
clsUtility.ExecuteSQLQuery( "SELECT * FROM ItemInformation WHERE ITEM_ID = @ItemID", new SQLiteParameter("@ItemID", ITEM_ID) );
内容的提问来源于stack exchange,提问作者Guissous Allaeddine
相关产品推荐
相关产品推荐

