[英]Arithmetic overflow error converting varchar to data type numeric. Error in asp.net
[英]Arithmetic overflow error converting varchar to data type numeric. when trying to read from a database DOES NOT happen every time
我正在嘗試從本地數據庫中讀取數據,並創建並返回一個對象。 我的代碼在調用它的循環的前3次中運行良好,然后失敗,給了我一個錯誤:將varchar轉換為數值類型的算術溢出錯誤。 我已經進行了很多調試,並且錯誤被拋出給reader.Read()。 據我所知,我在那里沒有進行任何轉換,並且我的所有研究都為該錯誤找到了完全不同的來源。 任何幫助將不勝感激。
System.Data.SqlClient.SqlDataReader reader;
/*Initialize Variables*/
using (SqlCommand cmd = GetCommand("SELECT * FROM tblInventoryItem where InvoiceID = " + InvoiceNumber))
{
//Do Work...
try
{
cmd.Connection.Open();
reader = cmd.ExecuteReader();
InventoryItem i;
NItem ni;
InventoryDataRepository2 idr = new InventoryDataRepository2();
while (reader.Read())
{
//Create an instance of the object....
i = new InventoryItem();
ni = new NItem();
ni.ItemNumber = (string)reader["ItemNumber"];
InventoryItem invitem = (InventoryItem)idr.GetItem(ni.ItemNumber);
ni.Title = invitem.Item.Title;
ni.Model = invitem.Item.Model;
ni.RetailPrice = invitem.Item.RetailPrice;
ni.WholesalePrice = invitem.Item.WholesalePrice;
i.Item = ni;
i.Quantity = Convert.ToInt32(reader["Quantity"]);
allItems.Add(i);
}
編輯:stacktrace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
at System.Data.SqlClient.SqlDataReader.Read()
at NeweggDistributor.InventoryItemDataRepository.GetAllItemsInInvoice(String InvoiceNumber) in c:\Users\AJ\Documents\Visual Studio 2012\Projects\NeweggDistributor\NeweggDistributor\InventoryItemDataRepository.cs:line 90
Arithmetic overflow error converting varchar to data type numeric.
我同意EricJ。我不認為Reader.Read()會引發此類錯誤。 我看到的很可能會引發此類錯誤,例如,如果DB中的“數量”字段是字符串並且無法轉換為整數,或者在DB中為null,因為無法將null轉換為任何整數。 其他可能性是RetailPrice和WholesalePrice字段。 也許您可以注釋掉這些行,並確保注釋掉后不會出現相同的錯誤。 那么您可以一次取消注釋每個字段,一次測試每個字段一個新字段。
我的第一個猜測是i.Quantity = Convert.ToInt32(reader["Quantity"]);
正在嘗試將varchar字段轉換為int且varchar字符串不是數字。 在這種情況下,我幾乎不會使用Convert.ToInt32或C#強制轉換,因為它們會引發意外的令人討厭的錯誤。 我創建了一個單獨的方法來轉換我想要的內容,然后將無法傳遞的默認值傳遞給它。 因此,我在轉換方法中使用了“ defaultValue”參數。
您的查詢是
SELECT *
FROM tblInventoryItem
WHERE InvoiceID = 1234
我的猜測是數據庫中的InvoiceID
是varchar字段。 這意味着您要在where子句中比較整數和varchar。 隱式轉換會將查詢更改為
SELECT *
FROM tblInventoryItem
WHERE CONVERT(int, InvoiceID) = 1234
如果數據庫中的任何InvoiceID包含不適合整數的內容,您都會收到錯誤消息。
算術溢出錯誤最可能導致發票> 2147483648
請注意,如果您的InvoiceNumber
也大於整數,則不會發生該錯誤。
SELECT *
FROM tblInventoryItem
WHERE InvoiceID = 5000000000
將起作用,因為它已更改為
SELECT *
FROM tblInventoryItem
WHERE CONVERT(bigint, InvoiceID) = 5000000000
解決方案當然是使用參數
command.CommandText = @"SELECT * " +
@"FROM tblInventoryItem " +
@"WHERE InvoiceID = @InvoiceNumber";
command.Parameters.Add("@InvoiceNumber", SqlDbType.VarChar).Value = InvoiceNumber;
(如果您確定InvoiceID僅包含數字,則也可以使用SqlDbtype.BigInt
類型的參數)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.