簡體   English   中英

將varchar轉換為數值數據類型的算術溢出錯誤。 嘗試從數據庫讀取時並非每次都會發生

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM