2009-11-23 30 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?