如何使用ADO.NET获取表中列的SqlDbType?

我试图在运行时确定sql server表列的SqlDbType是什么。

是否有一个类可以在System.Data.SqlClient中执行该操作,还是应该自己进行映射? 我可以从中获取字符串表示

SELECT DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG = '{0}' AND TABLE_SCHEMA = '{1}' AND TABLE_NAME = '{2}' AND COLUMN_NAME = '{3}' 

编辑:我不能使用SMO,因为我无法控制执行机器,所以我不能保证它将被安装。 (抱歉没有说清楚rp)。

编辑:在回答Joel时,我正在尝试创建一个我可以调用的函数,它会在传递SqlConnection,表名和列名时返回一个SqlDBType。

在SQL Server中,您可以使用FMTONLY选项。 它允许您在不获取任何数据的情况下运行查询,只返回列。

 SqlCommand cmd = connection.CreateCommand(); cmd.CommandText = "SET FMTONLY ON; select column from table; SET FMTONLY OFF"; SqlDataReader reader = cmd.ExecuteReader(); SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"]; 

如果您最终要读取数据,则可以执行以下操作:

 SqlCommand comm = new SqlCommand("SELECT * FROM Products", connection); using (SqlDataReader reader = comm.ExecuteReader()) { while (reader.Read()) { Type type = reader.GetSqlValue(0).GetType(); // OR Type type = reader.GetSqlValue("name").GetType(); // yields type "System.Data.SqlTypes.SqlInt32" } } 

对于SQL Server,请使用SMO(SQL Server管理对象)。

http://www.yukonxml.com/articles/smo/

例如,您可以使用此代码遍历表的所有列。

 Server server = new Server(); Database database = new Database( "MyDB" ); Table table = new Table( database, "MyTable" ); foreach ( Column column in table.Columns ) { WriteLine( column.Name ); } 

以下是您可以使用的所有列属性: http : //msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.column_members.aspx

老问题,但如果你要做的就是从字符串DATA_TYPE到SqlDbType枚举,原始问题中提出的查询结合一行代码就可以解决问题了:

 string dataType = "nvarchar"; // result of the query in the original question var sqlType = (SqlDbType)Enum.Parse(typeof(SqlDbType), dataType, true); 

您可以使用enum System.Data.CommandBehavior作为方法SqlCommand.ExecuteReader(System.Data.CommandBehavior.KeyInfo)的参数:

 SqlCommand cmd = connection.CreateCommand(); cmd.CommandText = "select column from table"; SqlDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.KeyInfo); SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"]; 

这个例子看起来像使用sql的例子:SET FMTONLY ON; 设置FMTONLY OFF。 但你不能使用SET FMTONLY。 在这种情况下,你没有
从表中接收数据。 您只收到元数据。