【问题标题】:Assigning SqlParameter.Value without knowing type or using mixed type array在不知道类型或使用混合类型数组的情况下分配 SqlParameter.Value
【发布时间】:2014-10-17 19:36:10
【问题描述】:

我正在处理一个数据层,它使用三个不同的存储过程调用数据库三次。我最初创建了三个不同的函数来检索结果的三个维度。第一个返回单个值,第二个返回整行,第三个返回表。它们还接受不同的参数。第一个采用两个 varchar,第二个采用两个 int,最后三个采用 varchar。如果我尝试花哨并如下所示将其全部合并,我会遇到问题吗?

public void CallStoredProcedure(string[] astrParams, string strConnectionString, string strStoredProcedure)
{
    int nParams = 0;
    SqlParameter[] asqlParams;
    asqlParams = SqlHelperParameterCache.GetSpParameterSet(strConnectionString, strStoredProcedure);
    foreach (string strParam in astrParams)
    {
        asqlParams[nParams].Value = strParam;
        nParams++;
    }
}

或者,我可以在不知道里面有什么的情况下使用混合数据类型的数组,我可以将不同的类型分配到同一个数组中,替换元素吗?

object[] aParams;
string strName = "Joe";
long lngHeight = 180;
object[0] = strName;
object[1] = lngHeight;
CallStoredProcedure(aParams, strConnectionString, "StoredProcedure1")

long lngWeight = 3;
string strItemName = "Bookend";
object[0] = lngWeight;
object[1] = strItemName;
CallStoredProcedure(aParams, strConnectionString, "StoredProcedure2")

然后将该函数内的代码更改为:

foreach (object oParam in astrParams)
{
    asqlParams[nParams].Value = oParam;
    nParams++;
}

在这两种情况中的一种或两种情况下我需要使用ToString() 吗?如果是这样,这是否本质上将它们变成了同一件事?就像我说的,现在我有三个函数可以接收正确输入的所有参数,但如果可能的话,我会尝试删除重复的代码。

【问题讨论】:

  • 查找Parameter.AddWithValue

标签: c# sql-server arrays object mixed


【解决方案1】:

你不能有一个不同数据类型的数组,你可以有一个对象数组,但在将值保存到类型化变量时,可以将单个元素转换为特定的数据类型。

不确定你想在哪里使用ToString(),但是如果你将一个字符串保存到一个对象数组中没有意义,但是如果你将一个对象保存到一个字符串变量,那么是的,你需要这样做:

string str = objectArray[0].ToString();

尽管如此,我会避免这整个混乱,并按照 DJ KRAZE 所说的并通过 Parameter.AddWithValue 添加您的参数。

【讨论】:

  • 感谢 mgrenier 多解释我的评论,使用 AddWithValue,让数据库解析数据类型,如果这更有意义.. 还有一篇好文章 Joe M Create array Objects of different datatypes 那里还有很多其他的好东西..
  • @DJKRAZE,参数的类型取决于您使用 .AddWithValue 分配的值,而不是数据库。即字符串将始终为 NVarchar(字符串长度)。如果在查询中使用它会污染计划缓存并可能导致隐式转换阻止索引使用。
  • adrianm 数据库仍然可以解析通过 AddWithValue 传入的数据类型。我实质上是说,当您可以只传入参数时,为什么要在 c# 代码中添加数据类型我认为很明显,当传入类型是字符串、整数、十进制等时,数据库可以解析类型,例如,如果你传递一个字符串值3.49,数据库方面仍然可以告诉你你是隐式或显式传递小数等。此时这都是语义上的。但我很欣赏你的洞察力
  • Adrianm 这是AddWIthValue 的一些文档,以便进一步了解Sql ParameterCollection.AddWIthValue
【解决方案2】:

我对我最初的问题需要做什么感到相当困惑。我意识到添加参数时我不需要担心 C# 类型,因为GetSpParameterSet 将我需要的所有信息拉入 SqlParameter 数组,并在每次调用它时重置数组。所以我的初始代码:

foreach (string strParam in astrParams)
{
    asqlParams[nParams].Value = strParam;
    nParams++;
}

...只会满足我的需要。将 C# string 类型分配给 SQL int 类型不会有任何问题,这是我主要关心的问题,因为这些语言无论如何都没有相同的类型。我知道我不必担心像“x”这样的东西会进入int 类型,因为我正在使用的所有值都是从其他 SQL 查询中正确键入的列中提取的。所以我不需要任何对象数组。

【讨论】:

  • 当一切都失败时,总是有所有 .NET 类型的母亲,对象。谨慎使用,Object 类型本身没有任何问题。事实上,许多广泛使用的方法都采用 Object 类型的参数(例如,StringBuilder.Append、Console.WriteLine、String.Format。
猜你喜欢
  • 2016-05-18
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
相关资源
最近更新 更多