簡體   English   中英

映射CLR參數數據

[英]Mapping CLR Parameter Data

我正在編寫存儲過程生成器,並且需要將CLR類型映射到其SQL Server類型。

MSDN在以下位置列出了類型映射: http : //msdn.microsoft.com/zh-cn/library/ms131092.aspx,但是我不想使用大的switch語句來處理映射。

是否有一種簡單的方法可以使用System.Data.SqlTypes使用的任何過程以字符串形式檢索SQL Server類型?

我想要這樣的方法簽名:

static string GetSqlType(Type clrType)
{
    ...
    return sqlType;
}

因此,給出以下調用:

string sqlType = GetSqlType(1.GetType());

sqlType應該包含:“ int”。

這變得相當復雜,因為它取決於您希望定位的SQL Server版本。

  • 對於2008年的目標,您可能希望DateTime的實例映射到改進的datetime2而不是datetime。
    • 由於您的后備選項使用DateTime或varchar,因此TimeSpan甚至更糟。

這是有關SQL Server 在復制方案中如何處理數據類型的指南

SQL Server Compact Edition不支持varchar(max)和varbinary(max)列類型(您只能使用顯式的〜4K長度的列),這進一步加劇了混亂。

在某些時候,您還需要對具有多種選擇的區域做出啟發式決策。

  • 文本信息可以是varchar(n)或varchar(max)。
    • 或XML(從2005年開始)
    • 或TEXT,但已棄用
  • 小數點將很好地映射到輸入的數字,但是在輸出時存在風險,因為數字的比例更大
  • 位圖應該是圖像還是varbinary?
    • 再次棄用了圖像,但這可能會使仍在使用它的人們感到煩惱。
  • 無符號整數
    • uint可以安全地放入bigint
    • 烏龍更成問題
    • bigints將更加有趣。

考慮到所有這些,在實用程序函數中使用漂亮的簡單switch語句將使生活比嘗試依賴某些僅用於類型轉換而不是文本sql創建的不透明BCL庫要容易得多。
它還通過默認的throw或默認的varchar(max)來明確表示“未定義”的行為將由您控制。

從形式的方法返回一個簡單的不可變類:

public sealed class SqlServerTypeDescription
{
    // for sql text construction
    public readonly string SqlServerName;
    // for code construction
    public readonly SqlDbType SqlDbType;
    // for code construction
    public readonly Type ClrType;

    // constructor etc.
}

您可能也想添加可選的精度/尺寸值,盡管這可能是您選擇留給用戶的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM