C# 如何使用ADO.NET获取表中列的SqlDbType?
我试图在运行时确定sql server表列的SqlDbType是什么 在System.Data.SqlClient中是否有一个类可以这样做,或者我应该自己进行映射?我可以从C# 如何使用ADO.NET获取表中列的SqlDbType?,c#,.net,sql-server,ado.net,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 C
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,因为我无法控制执行机器,所以我不能保证它会被安装。(很抱歉没有说清楚)
编辑:在回答Joel的问题时,我试图创建一个可以调用的函数,当传递一个SqlConnection、一个表名和一个列名时,该函数将返回一个SqlDBType。对于SQL Server,使用SMO(SQL Server管理对象) 例如,可以使用此代码遍历表的所有列
Server server = new Server();
Database database = new Database( "MyDB" );
Table table = new Table( database, "MyTable" );
foreach ( Column column in table.Columns )
{
WriteLine( column.Name );
}
以下是您可以使用的所有列属性:
在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"
}
}
旧问题,但如果您所要做的只是从字符串数据_类型获取到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)的参数: 此示例与使用sql的示例类似:SET FMTONLY ON;迅速启动。但你不必频繁地使用SET。在这种情况下,您不需要
从表中接收数据。您只收到元数据。回答得很好,但由于我不知道执行机器是否安装了SMO,恐怕它不是初学者。这确实很酷,但它是多线程安全的吗?是否有可能由于SET FMTONLY ON而中断,而其他人得到一个空记录集?这看起来是一个不错的解决方案,但有一个警告,不要使用此功能,因为它将在SQL Server的未来版本中被删除。请不要升级“SELECT*”。@MicahEpps有那么糟糕吗?
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"];