【问题标题】:c# recognize sql uniqueidentifierc#识别sql唯一标识符
【发布时间】:2016-01-14 12:28:54
【问题描述】:

我有一种方法,我想根据输入的类型以不同的方式使用。这就是我所拥有的:

public static DataTable GetS(string source = null, string customer = null)
    {
        if (source != null && customer == null) 
        {
            return GetDataTableFromQuery("db.GetS", new object[] { "@source", source });
        }
        else if (source == null && customer != null)
        {
            return GetDataTableFromQuery("db.GetS", new object[] { "@customer", customer });
        }
        else
        {
            throw new Exception("Bad input. Call GetS with GetS(source) or GetS(null,customer).");
        }
    }

sp 看起来像这样:

CREATE PROCEDURE [db].[GetS]

    @source as nvarchar(128) = NULL,
    @customer as nvarchar(128) = NULL

AS
BEGIN
IF @customer IS NULL
BEGIN
    SELECT 
        *
    FROM 
        db.S
    WHERE
        [Source] = @source
END
IF @source IS NULL
BEGIN
    SELECT 
        * 
    FROM 
        db.S
    WHERE 
        customer = @customer
END

END

这适用于GetS(source)GetS(null,customer),但我有两个问题。

  1. 如果有人用GetS(customer) 打电话会很糟糕
  2. 看起来不太漂亮..

有没有办法做这样的事情(伪代码):

public static DataTable GetS(string input)
{
    if(input is sql-uniqueidentifier)
    {
        return GetDataTableFromQuery("db.GetS", new object[] { "@source", input});
    }
    else
    {
        return GetDataTableFromQuery("db.GetS", new object[] { "@customer", input]);
    }
}

或者有更好的方法吗? (当然,我可以制作 2 种单独的方法,但我想让它只使用一种 Get-method。如果我制作 GetSBySource 或其他东西,感觉很奇怪)。

【问题讨论】:

  • 究竟是什么问题?开发者错误?为什么要将它放在一个方法中?是否会出现您想要同时传递两个值的情况? sql-identifier 有什么用?
  • 我认为更多的是关于架构
  • 如果source 被认为是一个独特的标识符,那么为什么它是string 而不是Guid
  • 我个人认为您也应该将该存储过程分开。
  • 要查看字符串是否包含有效的 GUID,您可以使用 Guid.TryParse 作为返回值。

标签: c# sql-server uniqueidentifier


【解决方案1】:

在你的情况下,为什么不写两个方法,这不奇怪!?我认为使用两种方法是最好的方法。

  1. public static DataTable GetSBySource(Guid source)
  2. public static DataTable GetSByCustomer(string customer)

这将使您的 API 方式更加可用和清晰。

如果您知道,有一次您需要它来传递Uniqueidentifier,您也可以将其设为通用:

public static DataTable GetS<T>(string input)
{
    if(T is Guid)
    {
        return GetDataTableFromQuery("db.GetS", new object[] { "@source", input});
    }
    else
    {
        return GetDataTableFromQuery("db.GetS", new object[] { "@customer", input]);
    }
}

但是你也应该让你的输入通用,因为将Guids 传递为strings 并不是很好...

使用错误的方法定义,在更改代码时会导致很多问题。例如,您需要将 Guid 传递给仅接受字符串的方法,而不是重构或更改代码将非常困难。此外,方法的定义,应该描述它的用法......

【讨论】:

  • 好的。感谢您的回复,我实际上最后使用了两种不同的方法=)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
相关资源
最近更新 更多