如何避免T-SQL错误:从类型DBNull到类型String的转换无效

时间:2016-05-19 20:52:56

标签: c# sql-server sql-server-2008 tsql dbnull

我使用以下T-SQL将数据插入到由C#构建的应用程序中。某些记录工作正常,但有些记录会给出以下错误。

enter image description here

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(对象   sender,InitializeRowEventArgs e)at   Infragistics.Win.UltraWinGrid.InitializeRowEventHandler.Invoke(对象   sender,InitializeRowEventArgs e)at   Infragistics.Win.UltraWinGrid.UltraGrid.OnInitializeRow(InitializeRowEventArgs   吃   Infragistics.Win.UltraWinGrid.UltraGrid.FireEvent(GridEventIds id,   EventArgs e)at   Infragistics.Win.UltraWinGrid.UltraGrid.FireInitializeRow(InitializeRowEventArgs   吃   Infragistics.Win.UltraWinGrid.UltraGridRow.FireInitializeRow()at   Infragistics.Win.UltraWinGrid.RowsCollection.FireInitializeRow(IList的   行)   Infragistics.Win.UltraWinGrid.RowsCollection.InitNonGroupByRows(IList的   fireInitializeRowOnTheseRows)at   Infragistics.Win.UltraWinGrid.RowsCollection.SyncRowsHelper(IList的   boundList)at   Infragistics.Win.UltraWinGrid.RowsCollection.SyncRows()at   Infragistics.Win.UltraWinGrid.RowsCollection.EnsureNotDirty()at at   Infragistics.Win.UltraWinGrid.RowsCollection.GetEnumerator()at   MISys.Client.MIUltraDataGrid.MIUltraDataGrid.RefreshGrid()at   MISysForms.MIDetailsTemplate.RefreshGrids(控制myparent)at   MISysForms.MIDetailsTemplate.RefreshGrids(控制myparent)at   MISysForms.MIDetailsTemplate.RefreshGrids(控制myparent)at   MISysForms.MIDetailsTemplate.RefreshGrids(控制myparent)at   MISysForms.MIDetailsTemplate.RecordChanged()at   MISysForms.MIItemDetails.RecordChanged()at   MISysForms.MIDetailsTemplate.GetPreviousRecord()at   MISysForms.MIDetailsTemplate.UltraToolbarsManager1_ToolClick(对象   发件人,ToolClickEventArgs e)at   Infragistics.Win.UltraWinToolbars.UltraToolbarsManager.OnToolClick(ToolClickEventArgs   吃   ....

3 个答案:

答案 0 :(得分:2)

询问你的数据行,例如,如果值不是空,那么你可以把它强制转换:

object Value = dataRow[columnName];
if (Value != DBNull.Value)

答案 1 :(得分:0)

您可以使用上述答案,或者如果您无法访问代码,请将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]);

答案 2 :(得分:0)

您的一个列返回NULL值,并且如堆栈跟踪中所示,调用ToString()函数会引发该错误。您可以使用TSQL,ISNULL函数重写SELECT语句。

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]);