Как избежать ошибки T-SQL: преобразование из типа DBNull в тип String недопустимо

Я использовал следующий T-SQL для вставки данных в приложение, созданное на C #. Некоторые записи работают нормально, но некоторые выдают ошибку, указанную ниже.

введите описание изображения здесь

INSERT INTO [MITESTCO].[dbo].[MIQSUP] ([itemId], [suplProdCode], [suplId])  
    SELECT
        [itemId], [suplId], [suplProdCode]  
    FROM 
        [table 28]   
    WHERE  
        [itemId] NOT IN (SELECT [itemId] FROM [MIQSUP]);

См. В конце этого сообщения подробные сведения о вызове оперативной отладки (JIT) вместо этого диалогового окна.

************** Текст исключения ************** System.InvalidCastException: преобразование из типа «DBNull» в тип «String» недопустимо. в Microsoft.VisualBasic.CompilerServices.Conversions.ToString (значение объекта) в MISys.Client.MIUltraDataGrid.MIUltraDataGrid.MIUltraDataGrid_InitializeRow (отправитель объекта, InitializeRowEventArgs e) в Infragistics.WinGrid.UltradataGrid .Win.UltraWinGrid.UltraGrid.OnInitializeRow (InitializeRowEventArgs e) в Infragistics.Win.UltraWinGrid.UltraGrid.FireEvent (GridEventIds id, EventArgs e) в Infragistics.Win.UltraWinGridize.Enc. UltraGridRow.FireInitializeRow () в Infragistics.Win.UltraWinGrid.RowsCollection.FireInitializeRow (IList rows) в Infragistics.Win.UltraWinGrid.RowsCollection.InitNonGroupByRows (IList fireInnitializeRows Win.UltraWinGrid.RowsCollecti on.SyncRows () в Infragistics.Win.UltraWinGrid.RowsCollection.EnsureNotDirty () в Infragistics.Win.UltraWinGrid.RowsCollection.GetEnumerator () в MISys.Client.MIUltraDataGrid.MIUltrantrids (myUltraDataGrid.MIUltrant). ) в MISysForms.MIDetailsTemplate.RefreshGrids (Control myparent) в MISysForms.MIDetailsTemplate.RefreshGrids (Control myparent) в MISysForms.MIDetailsTemplate.RefreshGrids (Control myparent) в MISysFormplate.RefreshGrids (Control myparent) в MISysFormplate.MIDRengedCemngedTemplate. MIDetailsTemplate.GetPreviousRecord () в MISysForms.MIDetailsTemplate.UltraToolbarsManager1_ToolClick (отправитель объекта, ToolClickEventArgs e) в Infragistics.Win.UltraWinToollickbars.UltraToolgsCanagerClick.


person Kin    schedule 19.05.2016    source источник
comment
Как насчет того, чтобы поделиться фактическим кодом, который вы используете?   -  person Sean Lange    schedule 19.05.2016
comment
Если вы щелкнете по деталям, сообщается ли вам более конкретно, откуда взялась эта ошибка?   -  person Tim Freese    schedule 20.05.2016
comment
@TimFreese да, я добавляю в конце своих вопросов   -  person Kin    schedule 20.05.2016
comment
Вот в чем проблема. Вы отправили сообщение об ошибке dotnet, и единственный код, который вы нам показали, - это запрос. Вы не можете получить это сообщение об ошибке из sql. Вам нужно показать нам код dotnet, если вы хотите найти реальный шанс найти решение.   -  person Sean Lange    schedule 20.05.2016
comment
@SeanLange, извините, у меня нет доступа к части .Net   -  person Kin    schedule 20.05.2016
comment
Что ж, ошибка в вашем коде dotnet. Очевидно, он пытается отобразить эти строки и вылетает, потому что не может обработать NULL. Вам нужно будет либо исправить то, что связано с dotnet, либо изменить свои данные, чтобы в них не было NULL. Я бы очень настаивал, что исправление кода - лучший подход. Изменение данных для приспособления к плохо написанному коду - не лучшая привычка.   -  person Sean Lange    schedule 20.05.2016


Ответы (3)


Спросите свой datarow, например, если значение не равно нулю, тогда вы можете нормально его преобразовать:

object Value = dataRow[columnName];
if (Value != DBNull.Value)
person Glenn Cuevas    schedule 19.05.2016

Вы можете использовать приведенный выше ответ или, если у вас нет доступа к коду, измените свой SELECT, чтобы вставить пустой вместо null, если у вас есть SQL Server

INSERT INTO [MITESTCO].[dbo].[MIQSUP] ([itemId], [suplProdCode], [suplId])  
SELECT
    IsNull([itemId],''), IsNUll([suplId], ''), ISNull([suplProdCode],'')  
FROM 
    [table 28]   
WHERE  
    [itemId] NOT IN (SELECT [itemId] FROM [MIQSUP]);
person Roger Barreto    schedule 19.05.2016

Один из ваших столбцов возвращает значение NULL, и, как указано в трассировке стека, вызов функции ToString () вызывает эту ошибку. Вы можете переписать свой оператор SELECT, используя функцию TSQL, ISNULL.

INSERT INTO [MITESTCO].[dbo].[MIQSUP] ([itemId], [suplProdCode], [suplId])  
SELECT
    [itemId], [suplId], ISNULL([suplProdCode],'') as suplProdCode
FROM 
    [table 28]   
WHERE  
    [itemId] NOT IN (SELECT [itemId] FROM [MIQSUP]);
person Vahid Farahmandian    schedule 19.05.2016