2014-10-17 70 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

相關問題