如何检测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
相关产品推荐
相关产品推荐

