C# 在不知道类型或使用混合类型数组的情况下分配SqlParameter.Value

C# 在不知道类型或使用混合类型数组的情况下分配SqlParameter.Value,c#,sql-server,arrays,object,mixed,C#,Sql Server,Arrays,Object,Mixed,我正在处理一个数据层,它使用三个不同的存储过程三次调用数据库。我最初创建了三个不同的函数来检索结果的三维度。第一个返回单个值,第二个返回整行,第三个返回表。它们还接受不同的参数。第一个取两个varchar,第二个取两个int,最后三个varchar。如果我试着像下面所示的那样去想象和合并,我会有问题吗 public void CallStoredProcedure(string[] astrParams, string strConnectionString, string strStoredP

我正在处理一个数据层,它使用三个不同的存储过程三次调用数据库。我最初创建了三个不同的函数来检索结果的三维度。第一个返回单个值,第二个返回整行,第三个返回表。它们还接受不同的参数。第一个取两个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()
?如果是这样的话,那从本质上说是不是把它们变成了同一件事?就像我说的,现在我有三个函数可以正确输入所有参数,但是如果可能的话,我会尽力消除重复的代码。

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

不确定要在何处使用
ToString()
,但如果在将字符串保存到对象数组中时没有意义,但如果要将对象保存到字符串变量中,则需要执行以下操作:

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

不过,我会避免整个混乱,按照DJ KRAZE所说的,通过
Parameter.AddWithValue
添加您的参数。

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

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

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

查找
参数。AddWithValue
谢谢
mgrenier
为了更详细地解释我的评论,使用AddWithValue可以让数据库解析数据类型(如果这更有意义)。。还有一篇好文章Joe M还有很多其他的好文章。@DJKRAZE,参数的类型是根据您用.AddWithValue指定的值确定的,而不是数据库。i、 e.字符串始终为NVarchar(字符串长度)。如果在查询中使用,它将污染计划缓存,并可能导致隐式转换,从而阻止索引的使用。
adrianm
数据库仍然可以解析通过AddWithValue传入的数据类型。。我想说的是,当你可以直接传入参数时,为什么要在c代码中添加数据类型?我认为很明显,当传入类型时,无论它是string、int、decimal等等。。数据库可以解析类型,例如,如果您传递的字符串值为
3.49
,则数据库端仍然可以判断您隐式或显式传递的是十进制等。。在这一点上都是语义上的。。但是我很感谢您的洞察力
Adrianm
这里有一些关于
AddWIthValue
的文档,以便进一步了解当所有其他操作都失败时,所有.NET类型的母对象总是存在的。节约使用,对象类型本身并没有问题。事实上,许多广泛使用的方法都采用Object类型的参数(例如,StringBuilder.Append、Console.WriteLine、String.Format)。