2011-09-19 3 views
10

나는이 같은 SQL 데이터베이스에서 얻은 DataTable을 가지고 : 나는 dataColumn.DataType을 통해 각 열의 데이터 형식을 얻을 때DataTable에서 열의 SqlType을 가져 오는 방법은 무엇입니까?

using (SqlCommand cmd = new SqlCommand(query, _sqlserverDB)) 
{ 
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
    { 
     DataSet dataSet = new DataSet(); 
     adapter.Fill(dataSet); 
     result = (dataSet != null && dataSet.Tables != null && dataSet.Tables.Count > 0) ? dataSet.Tables[0] : null; 
    } 
} 

를, I는 C# 유형 (INT32, INT64, 문자열 등을 얻을).

질문 : C# 형식 대신 네이티브 SQL 데이터 형식 (varchar, nvarchar, bigint ...)에 액세스하려면 어떻게합니까?

나는 dataColumn.DataType.UnderlyingSystemType을 시도했으며 그 결과는 동일합니다.

답변

9

System.Data.DataTable (또는 DataColumn 또는 DataSet, 또는 DataRow ...)은 데이터를로드 한 특정 데이터베이스 엔진에 관계없이 동일한 방식으로 작동하는 제네릭 .NET 데이터 컨테이너이므로 수행 할 수 없습니다.

이것은 SQL Server, MySql, Access, PostqlSQL 또는 기타 다른 용도로 .NET 커넥터를 사용했다면 DataTable 및 DataColumn 클래스는 항상 동일하며 ADO.NET 개체는 모든 db 엔진과 함께 작동한다는 것을 의미합니다. 따라서 .NET 유형을 사용하여 열을 유형을 알 수 있습니다.

28

... .NET 당신이 ..이 도움이 되었으면 좋겠 주어진 SQL 컬럼 유형으로 끝날 것입니다 입력 한 내용을 보여줍니다 닷넷에 SQL Server의 형식 매핑의 목록입니다 그것은 열의 SqlDbType을 가져올 수 있습니다. 대답은 SO : link입니다.

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"]; 
+0

이 대답은 나를 올바른 길로 인도했다. 고맙습니다! –

+0

환영합니다 :) – infografnet

+2

불행히도 SQL Server 2012 설명서에는이 기능을 사용하지 않는 메모가 있습니다. http://msdn.microsoft.com/en-us/library/ms173839.aspx – Naomi

7
SqlConnection SqlCon = new SqlConnection("Data Source=(local);Database= dbname;Integrated Security=SSPI;"); 

SqlDataReader SqlDr; 

SqlCon.Open(); 
SqlCmd = SqlCon.CreateCommand(); 

SqlCmd.CommandText = "select * from Tablename"; 

SqlDr = SqlCmd.ExecuteReader(); 
SqlDr.Read(); 
int i=0; 
while (i < SqlDr.FieldCount) 
{ MessageBox.Show(SqlDr.GetDataTypeName(i)); i++;}' 
+0

안녕하세요 Madhukar 및 StackOverflow에 오신 것을 환영합니다. 코드가하는 말의 설명을 추가해보십시오. 이것은 당신의 대답의 질을 높이고, 미래에 그것을 읽을 다른 사람들을 돕고, 더 많은 상향 회선을 줄 것입니다. 자세한 내용은 [답변 방법] (http://stackoverflow.com/questions/how-to-answer)을 참조하십시오. – bytebuster

+0

SqlDataReader.GetDataTypeName()을 사용하면 원시 SQL Server 형식을 반환합니다. SqlDataReader.GetFieldType()은 .NET Framework 형식을 반환합니다. 전 데이터베이스 열 유형이나 크기를 변경하기 위해 T-SQL 문을 작성해야 할 때 유용했습니다. –

0

것은 당신이 DataReader를를 사용하는 경우 - 당신이 컬럼의 SQL 데이터 유형을 원하는 경우

SqlDataReader reader = cmd.ExecuteReader(); reader.GetDataTypeName(int ordinal)

작동합니다

2

또 다른 방법은 SQL이 일을 할 수 있도록하는 것입니다 당신을 위해 :

 SqlConnection rConn = connectToSQL(); //returns sql connection 

     SqlCommand SqlCmd = new SqlCommand(); 

     SqlCmd = rConn.CreateCommand(); 

     SqlCmd.CommandText = "SELECT ORDINAL_POSITION, " + 
           "COLUMN_NAME, " + 
           "DATA_TYPE, " + 
           "CHARACTER_MAXIMUM_LENGTH, " + 
           "IS_NULLABLE " + 
          "FROM INFORMATION_SCHEMA.COLUMNS " + 
          "WHERE TABLE_NAME = 'TableName'"; 
     SqlDataReader SqlDr = SqlCmd.ExecuteReader(); 

     SqlDr.Read(); 
     while (SqlDr.Read()) 
      { 
      var OrdPos = SqlDr.GetValue(0); 
      var ColName = SqlDr.GetValue(1); 
      var DataType = SqlDr.GetValue(2); 
      var CharMaxLen = SqlDr.GetValue(3); 
      var IsNullable = SqlDr.GetValue(4); 
      Console.WriteLine("ColName - " + ColName + " DataType - " + DataType + " CharMaxLen - " + CharMaxLen); 
      } 
+0

이것은 단지 SqlDataTypes의 문자열 버전을 반환합니다. OP가 System.Data.SqlDbType 열거 형을 찾고 있습니다. – JBond