2014-10-17 67 views
0

我有一个数据层,我正在使用三种不同的存储过程调用数据库三次。我最初创建了三个不同的函数来检索三维结果。第一个返回单个值,第二个返回整行,第三个返回一个表。他们也采取不同的参数。第一个需要两个varchars,第二个int和最后三个varchars。如果我尝试变得幻想并将其全部合并,如下所示,我会遇到问题吗?在不知道类型或使用混合类型数组的情况下分配SqlParameter.Value

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()?如果是这样,这是否基本上把它们变成了同样的东西?就像我所说的,现在我有三个函数可以正确输入所有参数,但是如果可能的话,我试图摆脱重复的代码。

+1

查找'Parameter.AddWithValue' – MethodMan 2014-10-17 19:38:33

回答

0

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

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

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

+0

当所有其他都失败时,总是有所有.NET类型的对象,Object。谨慎使用,对象类型本身没有任何问题。实际上,许多广泛使用的方法需要Object类型的参数(例如,StringBuilder.Append,Console.WriteLine,String.Format。 – 2015-06-11 04:41:43

1

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

不知道要使用ToString()但如果当你保存字符串为对象数组有没有点,但如果要保存的对象为字符串变量则是你需要做的是:

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

虽然我会尽量避免这一切,但请按照DJ KRAZE所说的说,并通过Parameter.AddWithValue添加您的参数。

+0

感谢'mgrenier'多一点解释我的评论,使用AddWithValue,可以让数据库解析数据类型,如果这样做更有意义..还有一篇好文章Joe M [创建不同数据类型的数组对象](http://forum.unity3d.com/threads/c-arrays-with-multiple-types-of-data-at-each-point.144459/)还有很多其他好东西那里以及.. – MethodMan 2014-10-17 19:52:33

+0

@DJKRAZE,参数的类型取决于您使用.AddWithValue分配的值,而不是数据库。即字符串总是NVarchar(字符串的长度)。如果用在查询中,将会污染计划缓存,并可能导致隐式转换,从而阻止索引的使用。 – adrianm 2014-10-18 14:38:38

+0

'adrianm'数据库仍然可以解析通过AddWithValue传入的数据类型..我基本上是说,为什么在c#代码中添加数据类型时,你可以传递参数,我认为这是非常明显的,当传入的类型,无论是字符串,整数,小数等..数据库可以解析例如,如果你传递一个字符串值“3.49”,事物的数据库端仍然可以告诉你隐式地或者明确地传递了一个十进制数等。这一切都是语义的......但是我很感谢你的洞察力 – MethodMan 2014-10-20 15:20:16

相关问题