2009-11-23 2 views
1

수동으로하지 않고SqlType을 네이티브로 기본 SQL 형식 선언으로 변환하려면 어떻게해야합니까?

SqlInt32 -> "int" 
SqlGuid -> "uniqueidentifier" 
SqlXml -> "xml" 
SqlString -> "nvarchar(??)" 

처럼, 실제 SQL 유형 선언에 SQLTYPE을 번역하는 .NET하는 SqlClient있는 방법이 있습니까?

CLARIFICATION : 여러 SQL SELECT 문을 자동으로 리팩터링하려고하는데 어떤 형식으로 리턴되는지 알아야합니다. 나는 다음 코드를 실행하여 할 계획입니다 : 나는 형식을 가지고 한 번

using (var connection = new SqlConnection(SqlConnectionString)) 
{ 
    connection.Open(); 
    var command = connection.CreateCommand(); 
    command.CommandText = sql; 
    var reader = command.ExecuteReader(CommandBehavior.SchemaOnly); 
    for (int i = 0; i < reader.FieldCount; ++i) 
    { 
     var type = reader.GetProviderSpecificFieldType(i); 
     ... generate some sql code ... 
    } 
} 

그래서, 나는 몇 가지 SQL 코드를 생성하고 SqlTye이 GetProviderSpecificFieldType에 돌려 사용하는 것을 시도하고있다, 그리고 나는이 있는지보고 싶어 이미 SqlType을 사용하고 SQL 선언을 다시 사용할 수있는 함수입니다.

답변

1

해결책을 찾았습니다. GetSchemaTable을 사용하여 SQL 형식에 대한 세부 정보를 얻었습니다.

private string __type(SqlDataReader reader, int i) 
    { 
     var schema = reader.GetSchemaTable(); 
     var row = (from DataRow r in schema.Rows 
        where (int)r["ColumnOrdinal"] == i 
        select r).First(); 

     var type = (string) row["DataTypeName"]; 
     if (type == "nvarchar" || type == "varchar" || 
      type == "nchar" || type == "char") 
     { 
      int maxLength = (int) row["ColumnSize"]; 
      if (maxLength == 2147483647) maxLength = -1; 
      type += string.Format("({0})", (maxLength > 0) ? 
         (object) maxLength : (object) "max"); 
     } 
     return type; 
    } 
+0

+1, 솔루션을 공유해 주셔서 감사합니다. – Heinzi

2

잘 모르겠습니다. 아무 일이 없기 때문에 : 1 대응을 (예를 들어, SqlString는 SQL 서버 유형 char, nchar, text, ntext, nvarcharvarchar에 대응할 수), 이러한 기능은 원래의 유형이 있기 때문에, 무엇 추측 할 것 이 정보는 SqlString에 도착하면 더 이상 사용할 수 없습니다.

SqlString이 데이터베이스의 nvarchar(255)과 항상 일치한다는 것을 알고 있다면 this list을 시작으로 이러한 기능을 직접 작성할 수 있습니다.

달성하려는 목표는 무엇입니까? 어쩌면 ...

0

그렇진 총 중복 문제에 더 나은 솔루션이 있지만 opposite direction있다.

많은 문제가 많은 < -> 많은 매핑이 정확히 동일합니다.

모든 전자동 번역은 극히 과장되어 (예 : 문자열을 텍스트 열에 매핑하는 경우), 최악의 경우에는 약간의 미묘한 방법으로 잘못 번역됩니다.

적어도 버전에 따라 달라야합니다 (예 : DateTime 또는 DateTime2를 사용해야하는 경우)?

관련 문제