2009-11-23 77 views
1

是否有.NET的SqlClient的方式来翻译SQLTYPE实际SQL类型声明,就像如何将SqlType本地转换为基础SQL类型声明?

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

没有做手工?

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 2009-11-23 23:19:01

2

不是我所知道的。由于没有1:1点的对应(例如,SqlString可以对应于在SQL Server类型charnchartextntextnvarcharvarchar),这样的功能将不得不猜测什么原始类型是,由于此信息在您获得SqlString后不再可用。

如果您知道SqlString总是对应于您的数据库中的nvarchar(255),您可以自己编写这样一个函数,使用this list作为起点。

你想达到什么目的?也许有更好的解决您的问题...

0

不太总共重复,但存在opposite direction

它的问题很多< - >许多映射完全相同。

任何完全自动的翻译最多是过分热衷的(例如将任何字符串映射到TEXT列),最糟糕的情况是以某种微妙的方式。

至少它需要与版本有关,例如它应该使用DateTime还是DateTime2?