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

如何检测SQL Server Compact列数据类型是否为Int并按需修改为Float

问题原因

你当前的逻辑存在理解偏差:你查询的information_schema.columns系统表中的data_type字段本身为字符串类型,存储的是列数据类型的文本标识(如INT、FLOAT这类值)。你调用reader.GetFieldType(i)获取的是data_type这个返回字段本身的.NET数据类型,结果自然永远是string,和Amount列的实际数据类型无关联。

正确实现逻辑

直接读取data_type字段的返回值,通过字符串匹配判断Amount列的实际类型即可,修改后的代码如下:

private void CheckDataType()
{
    MessageBox.Show("Checking Data Type");
    string sqlcon = @"Data Source = .\Records.sdf;Persist Security Info=False";

    using (SqlCeConnection conn = new SqlCeConnection(sqlcon))
    {
        conn.Open();

        SqlCeCommand cmd = new SqlCeCommand(@"Select data_type
    from information_schema.columns
    where table_name = 'OutgoingChequeRecords' and column_name = 'Amount'", conn);

        SqlCeDataReader reader = cmd.ExecuteReader();
                  
        while (reader.Read())
        {
            MessageBox.Show("Reading Started");
            // 直接读取data_type字段的字符串值
            string columnDataType = reader.GetString(0).ToUpper();
            if (columnDataType == "INT")
            {
                MessageBox.Show("Type is INT");
                // 此处添加修改字段类型的逻辑,执行对应ALTER语句即可
                // SqlCeCommand alterCmd = new SqlCeCommand("ALTER TABLE OutgoingChequeRecords ALTER COLUMN Amount FLOAT", conn);
                // alterCmd.ExecuteNonQuery();
            }
            else if (columnDataType == "FLOAT")
            {
                MessageBox.Show("Type is Float");
            }
            else if (columnDataType == "DECIMAL" || columnDataType == "DOUBLE")
            {
                MessageBox.Show("Type is Decimal");
            }
            // 其余类型判断以此类推
        }
        MessageBox.Show("Reading Stopped, Connection Closed");

        conn.Close();
    }   
}

注意事项

修改字段类型前建议先备份表数据,避免类型转换过程中出现数据丢失问题。

内容的提问来源于stack exchange,提问作者NewDeveloper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:27:05