使用OLEDBCommand 读取的table schema并不支持SQL Server 一些特殊的数据类型,例如SmallDateTime. 可以通过查找 INFORMATION_SCHEMA.COLUMNS 获得SQLServer里的数据类型。
OleDbCommand cmd = new OleDbCommand("select * from tablename", con);
OleDbDataReader rd = cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly)
DataTable schemaTb = rd.GetSchemaTable(); // schemaTb里面的column type只是OleDB 支持的类型
cmd.CommandText = "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = tablename and COLUMN_NAME = columnName";
这样能得到column在SQL Server里的真实类型。
当然,如果一开始就是使用 System.Data.SqlClient,就不存在这个问题。