2017-01-31 55 views
0

遇到了我編寫了一些可在我的沙箱中工作的問題,包括指向外部數據庫但在我的發佈環境中無法運行的問題。從T-SQL返回的INT在發佈環境中未評估

我想要做的是從存儲過程獲得INT結果。我曾嘗試讓程序返回INT,並且在任何情況下都將其設置爲OUTPUT參數,但沒有運氣。請注意,這也適用於我自己的沙箱,但不適用於使用Visual Studio部署功能部署的已發佈環境。

這裏是C#評估整數返回代碼:

var returnVal = new SqlParameter("@ReturnValue", SqlDbType.Int) 
{ 
    IsNullable = true, 
    Direction = ParameterDirection.ReturnValue 
}; 



var sqlParams = new List<SqlParameter> 
{ 
    new SqlParameter("@Host", dataEntryModel.Host), 
    new SqlParameter("@PurchaseOrderNumberUser", dataEntryModel.PurchaseOrderNumberUser), 
    new SqlParameter("@PharmacyId", dataEntryModel.BatchUploadPharmacyId), 
    new SqlParameter("@NDCTable", table), 
    new SqlParameter("@LastModifiedById", dataEntryModel.LastModifiedById), 
    new SqlParameter("@POSourceTypeId", dataEntryModel.PurchaseOrderSourceType), 
    new SqlParameter("@PoId", dataEntryModel.PurchaseOrderId), 
    returnVal 
}; 

using (var connection = new SqlConnection(Database.ConnectionString)) 
{ 
    connection.Open(); 

    using (var command = new SqlCommand("AdminApp._spBatchUploadNDCToPurchaseOrder")) 
    { 
     command.Connection = connection; 
     command.CommandType = CommandType.StoredProcedure; 
     command.Parameters.AddRange(sqlParams.ToArray()); 
       // Setting command timeout to 120 second - Added by Tom Miller 10-31-14 
       command.CommandTimeout = 600; 
     command.ExecuteScalar(); 
     returnPurchaseOrderNumber = Convert.ToInt32(command.Parameters["@ReturnValue"].Value); 
    } 
}   
return returnPurchaseOrderNumber; 

我不知道這是爲什麼不能在其他環境中工作。我已將沙箱指向我的部署環境中使用的Development數據庫,並且在運行時顯示正在評估的返回碼爲0,這是不正確的。

已解決經過一番測試,我完全偏離了方向。我的數據設置正確,但是由於SQL方面的體系結構差而導致DEV中的數據佈局有所不同。謝謝你,併爲時間道歉。

+0

是這實際上訪問的外部使用''returnPurchaseOrderNumber我會宣佈這個之外呢,使這條線將是有效的'返回returnPurchaseOrderNumber'聲明最初使用這個外部的變量沒有被聲明爲''@ReturnValue'' – MethodMan

+0

我可以確認它是。 returnPurchaseOrderNumber在上面聲明並因此可訪問。 – Garbonauta

+0

另外,發表評論。這應該是一個ExecuteNonQuery。沒有選擇行。原來是這樣,但顯然我粘貼的代碼是在修補後。 – Garbonauta

回答

0

您試圖以錯誤的方式投下結果。試試這個:

int result = Convert.ToInt32(command.ExecuteScalar()); 
+0

這沒有用的代碼我在工作的時間,但它也是我的粘貼用的ExecuteScalar的代碼錯誤。我的代碼無法執行查詢,因此執行標量是行不通的。 我修改做一個選擇的代碼集,從而得到用於執行標量,而不是返回代碼的結果。我有同樣的問題,這導致我相信我看着這個錯誤。 – Garbonauta

0

command沒有一個叫@ReturnValue參數。 [編輯:對不起,是的它,看評論]設置斷點和檢查,但它可能是評估爲null,並試圖null轉換爲整數。如果你的存儲過程返回一個值,那麼使用NicoRiff的方法並分配結果。我希望拋出一個異常,但是如果它沒有,它將評估爲默認的整數值,即0.

如果你的存儲過程返回一個值,的ExecuteScalar()到一個變量。如果它使用輸出參數,則給它一個使用。聲明輸出參數是這樣的:

new SqlParameter("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.Output 
+0

通過將此參數的方向設置爲返回,我成功捕獲返回值。如果我在我的沙箱中投了一個斷點,這個工作正常,我也沒有任何問題。 我也注意到,我試圖使@ReturnValue和OUTPUT參數,實際上我使PoId Inputoutput參數產生相同的結果。它在我的本地沙箱中運行,但在我的部署環境中無法運行。 – Garbonauta

+0

當你說你將參數的方向設置爲返回時,你是在存儲過程還是在C#代碼中執行此操作?如果你是用C#做的,它不會顯示在你的代碼示例中。如果你在你的存儲過程中設置它,那麼我不熟悉這種方法,但它可能只是返回這個值。如果是這種情況,那麼'command.ExecuteScalar()'返回一個'對象',你可以把它作爲一個整數進行投射--NicoRiff的答案顯示了這種方法。 –

+0

var returnVal = new SqlParameter(「@ ReturnValue」,SqlDbType.Int) { IsNullable = true, Direction = ParameterDirection.ReturnValue }; – Garbonauta