c# 识别 sql uniqueidentifier
c# recognize sql uniqueidentifier
我有一个方法,我想根据输入的类型使用不同的方法。这是我的:
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)
但我有 2 个问题。
- 如果有人用
GetS(customer)
打电话,情况就会变糟
- 看起来不是很漂亮..
有没有办法做这样的事情(伪代码):
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
方法。如果我制作 GetSBySource
或其他东西,感觉很奇怪)。
在你的情况下,为什么不写两个方法,这不是奇怪!!吗?我认为使用两种方法是最好的方法。
public static DataTable GetSBySource(Guid source)
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]);
}
}
但是你也应该让你的输入通用,因为将 Guid
s 作为 string
s 传递,并不是很好...
使用错误的方法定义,在更改代码时会导致很多问题。例如,您需要将一个 Guid 传递给该方法,该方法只接受字符串,而不是重构或更改代码将非常困难。此外,方法的定义,应该描述它的用法...
我有一个方法,我想根据输入的类型使用不同的方法。这是我的:
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)
但我有 2 个问题。
- 如果有人用
GetS(customer)
打电话,情况就会变糟
- 看起来不是很漂亮..
有没有办法做这样的事情(伪代码):
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
方法。如果我制作 GetSBySource
或其他东西,感觉很奇怪)。
在你的情况下,为什么不写两个方法,这不是奇怪!!吗?我认为使用两种方法是最好的方法。
public static DataTable GetSBySource(Guid source)
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]);
}
}
但是你也应该让你的输入通用,因为将 Guid
s 作为 string
s 传递,并不是很好...
使用错误的方法定义,在更改代码时会导致很多问题。例如,您需要将一个 Guid 传递给该方法,该方法只接受字符串,而不是重构或更改代码将非常困难。此外,方法的定义,应该描述它的用法...