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

时间:2009-01-19 23:16:01

标签: c# .net sql-server ado.net

我正在尝试在运行时确定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。

5 个答案:

答案 0 :(得分:15)

在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"];

答案 1 :(得分:2)

如果您最终要阅读数据,可以这样做:

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"
    }
}

答案 2 :(得分:1)

对于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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您可以使用枚举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。在这种情况下,你不要 从表中接收数据。您只收到元数据。