You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:57:30