Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用ADO.NET获取表中列的SqlDbType?_C#_.net_Sql Server_Ado.net - Fatal编程技术网

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

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

我试图在运行时确定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,因为我无法控制执行机器,所以我不能保证它会被安装。(很抱歉没有说清楚)


编辑:在回答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"];